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

单片机开发之C语言编程基本规范

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本规范主要针对单片机编程语言和08编译器而言,包括排版、注释、命名、变量使用、代码可测性、程序效率、质量保证等内容。 / a* w- X- O+ s+ V, d7 Y0 _- h1 S
1.基本规则
" l( _+ m6 c1 t3 M- t1 S/ k5 W
格式清晰、注释简明扼要、命名规范易懂、函数模块化、程序易读易维护、功能准确实现、代码空间效率和时间效率高、适度的可扩展性、单片机编程规范-标识符命名
8 c1 {) U5 D% Q4 N. z
2.标识符命名 2.1 命名基本原则 9 w) B$ c, G1 o" D& p  R
1)命名清晰明了,有明确含义,使用完整单词或约定俗成的缩写。通常,较短的单词可通过去掉元音字母形成缩写;较长的单词可取单词的头几个字母形成缩写。即"见名知意"。(2)命名风格要自始至终保持一致。
$ k$ f# J8 `6 m* P' O' S
3)命名中若使用特殊约定或缩写,要有注释说明。. v2 ], `9 `, |( {, n
4)同一软件产品内模块之间接口部分的标识符名称之前加上模块标识。
7 ^* x+ j, ~. ?: R8 }
2.2 宏和常量命名
  n; w! @, d$ m* ]; e1 J, L
宏和常量用全部大写字母来命名,词与词之间用下划线分隔。对程序中用到的数字均应用有意义的枚举或宏来代替。
  _. m3 n! S: J7 p
2.3 变量命名 * I5 r3 N' j* U' M9 @
变量名用小写字母命名,每个词的第一个字母大写。类型前缀(u8\s8 etc.)全局变量另加前缀g_。
5 a! w$ Q1 q. l$ W# ]; t8 W
局部变量应简明扼要。局部循环体控制变量优先使用i、j、k等;局部长度变量优先使用len、num等;临时中间变量优先使用temp、tmp等。0 L" w" W# D6 g8 e% g0 P
2.4 函数命名
' o$ J. C3 r& a4 M$ v# Y
函数名用小写字母命名,每个词的第一个字母大写,并将模块标识加在最前面。- C! a1 Z3 V; P5 D1 z  d
2.5 文件命名
2 D' v/ E6 p2 a) l* j( a: Z' T
一个文件包含一类功能或一个模块的所有函数,文件名称应清楚表明其功能或性质。2 e6 M" B! {; K/ x! w' ^
每个.c文件应该有一个同名的.h文件作为头文件。
% o4 Q2 E5 o* S  `2 Z0 v4 S
3.注释 3.1 注释基本原则 " v6 F& B8 O0 Q% U
有助于对程序的阅读理解,说明程序在"做什么",解释代码的目的、功能和采用的方法。
. z* ^& v9 ^* W5 u% U& \
一般情况源程序有效注释量在30%左右。. x1 L  t0 h' L  w' h
注释语言必须准确、易懂、简洁。: _; I2 {# c1 f3 W% a. i4 c
边写代码边注释,修改代码同时修改相应的注释,不再有用的注释要删除。  E8 `+ l( x  V; V/ v+ T% r4 M# G
汇编和C中都用"//",取消";"  不使用段注释" /*  */ "(调试时可用)
" l; g4 n1 b7 C7 x1 j3 R7 g& b
3.2 文件注释 0 |; c* _7 m- M! g1 b7 x) [8 p! q
文件注释必须说明文件名、函数功能、创建人、创建日期、版本信息等相关信息。
+ f7 }1 s2 h; ^) \
修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的目的。所有修改记录必须保持完整。
# n" z6 c, r/ M. a( ]
文件注释放在文件顶端,用"/*……*/"格式包含。
" h/ |! c0 \" }
注释文本每行缩进4个空格;每个注释文本分项名称应对齐。# Z0 Z9 X, {' d- _" C4 p
/***********************************************************  A  l5 p/ F$ Q5 ]7 W1 U! C3 e
文件名称:2 C! V6 ~/ O% |% r2 W
者:
; e/ X1 C( ^- I
本:, ]! n- R7 t: o7 E/ _
明:& T* Y/ V# @9 a5 v8 v9 u
修改记录:) U6 U! j  d7 m% T7 X
***********************************************************/, L: Y0 Y$ P, y  M, D
3.3 函数注释
4 u: t- a  F( Y! n) U  j: ~. v
3.3.1 函数头部注释
+ e  \* p/ s( ]. Q0 H/ K( a0 h% |  t
函数头部注释应包括函数名称、函数功能、入口参数、出口参数等内容。如有必要还可增加作者、创建日期、修改记录(备注)等相关项目。' w0 F4 l& p6 y: W, @/ n6 Z* n, ]
函数头部注释放在每个函数的顶端,用"/*……*/"的格式包含。其中函数名称应简写为Name(),不加入、出口参数等信息。
4 ^# h6 N3 v" V9 h$ ]5 f  y
/***********************************************************
  H8 h$ i' t. Y, t: b6 V
函数名称:8 V  ~. {/ M& [; B
函数功能:
: m; h7 M' I3 C  j0 [. T
入口参数:% Y7 [+ t) x  z0 l: s
出口参数:
; l% A( U  W# d5 u; |7 H
注:
6 r" e( ?  z: [% n
***********************************************************/7 d0 Q+ w3 B6 J$ b: ?4 c8 X" e
3.3.2 代码注释信、盈、达‘腾讯:以一齐捂捂吧久零久要’
5 j8 i1 @3 V& ^' d+ _- v
代码注释应与被注释的代码紧邻,放在其上方或右方,不可放在下面。如放于上方则需与其上面的代码用空行隔开。一般少量注释应该添加在被注释语句的行2尾,一个函数内的多个注释左对齐;较多注释则应加在上方且注释行与被注释的语句左对齐。( {. R/ [4 ^) m4 j2 X
函数代码注释用"//…//"的格式。. r2 f. ^7 I; T
通常,分支语句(条件分支、循环语句等)必须编写注释。其程序块结束行"}"的右方应加表明该程序块结束的标记"end of ……", 尤其在多重嵌套时。4 K9 c. a( D* O: [- A  u4 G
3.4 变量、常量、宏的注释
. Q6 V2 M) b- x' C+ X
同一类型的标识符应集中定义,并在定义之前一行对其共性加以统一注释。对单个标识符的注释加在定义语句的行尾。- u( z' L: k# [) U$ X) l6 w, G
全局变量一定要有详细的注释,包括其功能、取值范围、哪些函数或过程存取它以及存取时的注意事项等。
$ v+ t, a  [6 V- c& ~
注释用"//…//"的格式。 ' p$ J' j( B0 ?# v- V
4.函数 4.1 函数设计原则 9 t. ?2 h+ u: _; {5 x
函数的基本要求:
% `1 G; w0 b/ t) S% \4 h
1)封装性
" x0 x# C- d% ^3 W$ i" P8 {! W
1) 正确性:程序要实现设计要求的功能。5 j/ y' X$ |. o% ^1 K- q7 E! {
2) 稳定性和安全性:程序运行稳定、可靠、安全。
6 R- a4 \  ^% X* M; |
3) 可测试性:程序便于测试和评价。
/ A# o7 H. m$ y. j% z
4) 规范/可读性:程序书写风格、命名规则等符合规范。
3 G; f8 ~$ B" @5 R3 V" o4 D2 m
5) 扩展性:代码为下一次升级扩展留有空间和接口。
9 n0 s* r0 W* `& i+ {
6) 全局效率:软件系统的整体效率高。! {: o: e( P6 M+ R
7) 局部效率:某个模块/子模块/函数的本身效率高。
; d3 h8 t% {" ^  m) E% f
编制函数的基本原则:& n, L9 Q( Q( u+ G' z, y
1) 单个函数的规模尽量限制在200行以内(不包括注释和空行)。一个函数只完成一个功能。
0 l) F# \. q1 W! c
2) 函数局部变量的数目一般不超过5~10个。' g/ R. _: u/ p( ~
3) 函数内部局部变量定义区和功能实现区(包含变量初始化)之间空一行。$ [, w( t' s8 \2 m$ Q  |, b' O
4) 函数名应准确描述函数的功能。通常使用动宾词组为执行某操作的函数命名。
: y4 H6 s& q" g: P! I
5) 函数的返回值要清楚明了,尤其是出错返回值的意义要准确无误。
0 g$ W- r( W9 J# I$ Q# Y
6) 不要把与函数返回值类型不同的变量,以编译系统默认的转换方式或强制的转换方式作为返回值返回。
% S, O# Z" E8 i. n' y- Q
7) 减少函数本身或函数间的递归调用。
' C# N* o8 P! ^, {& j
8) 尽量不要将函数的参数作为工作变量。
6 `$ ~( d& A/ I4 @
4.2 函数定义 4 p3 I+ A- Z' g; @0 |9 j
1) 函数若没有入口参数或者出口参数,应用void明确申明。" X6 ^. G. m& r0 h8 E
2) 函数名称与出口参数类型定义间应该空一格且只空一格。
. _5 d& ^: J( k, |' J
3) 函数名称与括号()之间无空格。
2 \/ x9 i8 b, d7 |# ?
4) 函数形参必须给出明确的类型定义。
8 u; x, g3 ~- H; I8 g. g! a$ f: J
5) 多个形参的函数,后一个形参与前一个形参的逗号分割符之间添加一个空格。
8 }1 h. a% j# T+ ^
6) 函数体的前后花括号"{}" 各独占一行。( p* t  I8 Z! s: w+ ?2 R: P4 f
4.3 局部变量定义 9 I( o8 a, w# p9 ]8 O
1) 同一行内不要定义过多变量。* `7 H, P8 x# j; ~9 s
2) 同一类的变量在同一行内定义,或者在相邻行定义。
) f" z/ s5 v1 G) S9 b  R; i4 @
3) 先定义data型变量,再定义idtata型变量,再定义xdata型变量.(?)
3 ^4 I  T# L( E
4) 数组、指针等复杂类型的定义放在定义区的最后。! C( ?$ L& N* ]
5) 变量定义区不做较复杂的变量赋值。
0 B1 {, e0 n/ h# ?
4.4 功能实现区规范 ! Q" z% e) S7 x2 f1 @% [7 b
1) 一行只写一条语句。- Z2 Y2 a3 J1 P( ^' b% X
2) 注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。2 {. |' A4 h% ?/ w6 b8 X0 x7 ]. ~
3) 各程序段之间使用一个空行分隔,加以必要的注释。程序段指能完一个较具体的功能的一行或多行代码。程序段内的各行代码之间相互依赖性较强。(1、2、3方式)
$ V% S7 b( Q6 a0 c2 P9 w  D) l7 B
4) 不要使用难懂的技巧性很高的语句。1 |: Z4 h4 }( c
5) 源程序中关系较为紧密的代码应尽可能相邻。
1 e9 R5 y  j, m% E7 }1 ^* ?$ [
6) 完成简单功能、关系非常密切的一条或几条语句可编写为函数或定义为宏。
2 ~; p6 s5 s5 o  l! n# L* U
5. 单片机编程规范-排版 3 W% R" c" y! g2 _7 M
* }" m+ A+ o5 X; _# }

该用户从未签到

2#
发表于 2017-9-8 08:06 | 只看该作者
顶起来!!!
$ i0 g! j2 C" }! ~, h' [顶起来!!!
# f2 V/ f0 i7 ~! a顶起来!!!
- g% z) m: x  V7 [顶起来!!!

该用户从未签到

3#
 楼主| 发表于 2017-9-9 16:31 | 只看该作者
linyufeng1989 发表于 2017-9-8 08:060 x4 }& d& S" Z
顶起来!!!
' g! Y8 a# `9 E/ A) t7 x+ P7 z顶起来!!!+ d5 i  S$ |) D9 Z- c: ~8 x8 @* N2 c
顶起来!!!

$ q7 G# X/ U5 c谢谢。
" L, t; m; X! M) J5 W! o8 a# s

该用户从未签到

4#
发表于 2017-11-25 20:08 | 只看该作者
呵呵,等着就等着....

该用户从未签到

6#
发表于 2019-1-8 15:53 | 只看该作者
学习一下规范
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-12 18:20 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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