找回密码
 注册
关于网站域名变更的通知
查看: 405|回复: 3
打印 上一主题 下一主题

谈谈C51的编程规范

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-8-9 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
现在单片机的程序设计,C51已经得到广泛的推广和应用,算是单片机的主流设计程序,甚至可以说作为单片机开发人员必须要掌握的一门语言了。8 Z4 o8 C4 O* a7 ^2 d* a

1 ^/ _, \+ \0 x: \+ ~( b3 l% L+ S    作为一门工具,最终的目的就是实现功能。在满足这个前提条件下,我们希望我们的程序能很容易地被别人读懂,或者能够很容易地读懂别人的程序,在团体合作开发中就能起到事半功倍之效。在网上请求帮助时,如能以规范的写法贴出程序,网友会比较容易地明白你的问题,则会比较快的得到网友的帮助,否则让人看上半天也不明所以然,这样就达不到预期的效果了。因此,为了便于源程序的交流,减少合作开发中的障碍,希望大家能够探讨一下C51的编程规范。把各人认为好的建议提出来,然后做一个总结,作为一种大家一致认同的规范,我认为将会是一件很有意义的事。我先提出一些自已的想法,以此抛砖引玉。
; U# i, G" R' G( F( k0 g$ M
5 x) g( ~; E7 x1 }9 P一、注释
# k, f# u5 u0 y! c0 C' ~5 i6 P& o! R) g: L$ m# G" Z
1,采用中文;0 Y9 s6 E4 \* H/ l
2,开始的注释:9 T, D" ^. |: ]- f. F
& m7 R6 @: N3 _+ S9 }: |( H. a
文件(模块)注释内容:3 A) Q; j5 F5 W
公司名称、版权、作者名称、修改时间、模块功能、背景介绍等,复杂的算法需要加上流程说明;
: y/ L, T" T) }; w' \9 A+ N, `6 c$ U7 j" b
比如:! @- a/ j( Z) F% R2 K
/*********************************************************************/
6 j% \6 Q1 o/ Z; c0 x  {/*公司名称: */. G( z4 s3 t# |! @+ \& w

& D! g- L" V; M) [8 A9 I' @/*模 块 名: LCD 模块 LCD 型号:HD44780 */
" ^5 q: |2 J/ ^' B' x; q  j8 e; b7 |! c- d% o0 s( S
/*创 建 人:zhaojunjie 日期:2001-06-08 */
  ?1 o+ P; O, |6 h3 {/*修 改 人: 日期:2001-06-08 */
- b% N, o! _; B4 |0 _5 O. a' U4 d/*功能描述: */' c& W' f: T( p2 F
/*其他说明: */: c' Z! z) e! C, \% G1 E5 X( c
/*版 本:
0 h* e- N; c; L6 q$ B( B/**********************************************************************/
1 q) s8 }* c2 \: v* B; [5 \: a: T$ \5 y0 k
函数开头的注释内容:+ O7 M1 x: l+ {. H
函数名称、功能、说明 输入、返回、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明;
- Y* S( e0 a4 U0 d! O' X% h/ s) N( p1 [9 v; E' a
/*********************************************************************
9 j: ?. T! t% m& D" O' E! A9 Y*3 t3 n. g: p  @  }9 |
* 函 数 名: v_LcdInit
5 }- j. x2 b' N8 g1 v# F* 功能描述: LCD初始化( T% B8 e) Z; ~7 E: Z, x. p
* 函数说明: 初始化命令:0x3c, 0x08, 0x01, 0x06, 0x10, 0x0c4 ?+ J: i7 u- \7 @  `8 J
* 调用函数: v_Delaymsec(),v_LcdCmd()
5 ~4 n$ x% q$ q, Q/ o* 全局变量:& I8 c9 k* Z3 d. I
* 输 入: 无/ t. Z1 e8 T* Z5 K0 t
* 返 回: 无
) W! C. u$ u# Z- a6 z1 }0 \+ e4 K7 I0 G' C* 设 计 者:zhao 日期:2001-12-09
1 r8 j  Z# T2 d& O; W6 ?, q) x* 修 改 者:zhao 日期:2001-12-09' f9 I' x6 Q0 U6 s; b+ W) U! h- _
* 版 本:
; P$ D( a, d2 Z" c$ o***********************************************************************/
5 }8 c# |/ v& n& V2 x( a* v
" L; a( x" c  K( I3、程序中的注释内容:! Z6 j6 R% N/ t: v( e% J

# A8 P* k4 P. a3 E+ x9 t修改时间和作者、方便理解的注释等。注释内容应简炼、清楚、明了,一目了然的语句不加注释。; v( }9 M# u: G$ X) R! q& j  Q* r
, q! ~' k. p5 l: L
二、命名:+ t2 w( d' s7 i% F  _9 d

+ n& T( }5 \0 P1 V9 K! e# T命名必须具有一定的实际意义。+ S0 a+ j, s( H- r
7 u5 |2 \6 B8 k" n. h+ f3 `
1、常量的命名:全部用大写。" r9 n' A3 u" |$ C

  ?  {( ?& q; W5 f2、变量的命名:' i0 G3 t3 M7 M( \6 n) {" [
变量名加前缀,前缀反映变量的数据类型,用小写,反映变量意义的第一个字母大写,其他小写。 ' l' F2 ~) Y! B: I# W7 W% ?: s* K2 M# c
其中变量数据类型:& \( w. J: X& E! b* }' S+ g
unsigned char 前缀 uc signed char 前缀 sc $ S) ]3 W+ U8 Y+ `! G
unsigned int 前缀 ui signed int 前缀 si/ u9 s" F% ^6 b1 |- M& |
unsigned long 前缀 ul signed long 前缀 sl
; L# ^4 V- G& ^( `bit 前缀 b 指针 前缀 p. l) ]) B8 W  {, ]* {) p: `

9 V% O/ |% w' ?2 k例:ucReceivData 接收数据
8 ]3 y8 y0 d; _3、结构体命名:
' }" q) H" I- U1 Q6 B/ q# z) `
- l5 I" Y+ h1 |* f5 a  W2 r4、函数的命名:4 _, f1 v. y7 ~2 n+ w; H. k
函数名首字大写,若包含有两个单词的每个单词首字母大写。
" g+ ?- F- n. A* J5 J函数原型说明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名, 内部函数,只要注释其定义文件名;& S1 S2 B! h; v# r# x
; x; c3 i3 n1 c' y4 h: O3 J7 S
三、编辑风格
- A( v- c0 ^% j6 Q5 Y$ U( h7 X+ D6 P+ @% e
1、缩进:缩进以 Tab 为单位,一个 Tab 为四个空格大小。预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。语句块的“{”“}”配对对齐,并与其前一行对齐;
- G  \! O- ?3 z$ @" ~% f! e1 A
9 d% Y- l2 A2 M: g: h2、空格:数据和函数在其类型,修饰名称之间适当空格并据情况对齐。关键字原则上空一格,如: % m. p1 f  ]( Z: h( [
if ( ... ) 等,运算符的空格规定如下:“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正负号),“&”(取址或引用)、“*”(指使用指针时)等几个运算符两边不空格(其中单目运算符系指与操作数相连的一边),其它运算符(包括大多数二目运算符和三目运算符“?:”两边均空一格,“(”、“)”运算符在其内侧空一格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。“,”运算符只在其后空一格,需对齐时也可不空或多空格,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。& O3 a0 C/ R; B- `
; Y0 T2 ^: Z/ r+ ^) o; i4 _, I. B7 m
3、对齐:原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在“,”处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。- ~9 ^7 h' K2 H% A; Y

$ d3 m* _) r! o3 Q% c; U0 J4、空行:程序文件结构各部分之间空两行,若不必要也可只空一行,各函数实现之间一般空两行. Z! S% M2 B, O1 s* J# ]0 a7 [

- @! _8 R% Y1 |4 w5、修改:版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。$ D5 K+ H; B% ]: w6 ]
- t8 m8 Y5 n# U  U* N/ N
6、形参:在定义函数时,在函数名后面括号中直接进行形式参数说明,不再另行说明。

该用户从未签到

2#
发表于 2016-8-9 16:38 | 只看该作者
楼主辛苦了!
3 Z6 K7 f+ i: f3 O+ V6 T# o

该用户从未签到

3#
发表于 2016-8-10 09:29 | 只看该作者
谢谢分享,必须赞一个~* S8 Z8 e6 x/ F; N

该用户从未签到

4#
发表于 2019-1-14 15:44 | 只看该作者
不错,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 14:38 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表