C编码规范

来源:互联网 发布:四级仔细阅读技巧知乎 编辑:程序博客网 时间:2024/04/29 11:46

1.排版

1-1:程序块要采用缩进风格编写,缩进为4个空格,一般编辑器都可以设置,敲Tab键会自动插入4个空格。VC6中在Tools-Options-Tabs下设置。
1-2:相对独立的程序块之间、变量声明之后必须加空行。
1-3:较长的语句(>90字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
1-4:循环、判断等语句中若有较长的表达式或语句,则要进行适应的换行,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
1-5:若函数或过程中的参数较长,则要进行适当的换行。
1-6:不允许把多个短语句写在一行中,即一行只写一条语句。
1-7:if、while、for、default、do等语句自占一行。
1-8:代码中不包含TAB键,使用4个空格键代替。
1-9:函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从语句缩进要求。
1- 10:程序块的分界符"{"要在同一行,"}"应各独占一行,同时与引用它们的语句左对齐。在函数体的开始、类的定义、 结构的定义、枚举的定义以及if、for、do、while0、switch、case语句中的程序都要采用如上的缩进方式。
1-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。
1-12: 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。

2.注释

2-1:尽量通过变量和方法命名让代码可读,只在很难看懂代码含义的地方加注释,不要过度注释。
-2-2:说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。-
2-3:源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 。VC中配置方法
2-4:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。。VC中配置方法
2-5:修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
2-6:注释的内容要清楚、明了,含义准确,防止注释二义性。
2-7:避免在注释中使用缩写,特别是非常用缩写。
2-8:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
2-9:应该尽量在变量常量命名中体现其含义,对于所有有物理含义变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在其上方相邻位置或右方。
2-10:数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。
2-11:全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。
2-12:注释与所描述内容进行同样的缩排。
2-13:将注释与其上面的代码用空行隔开。
2-14:对含义不明显的分支语句(条件分支、循环语句等)编写注释。
2-15:对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释。

3.标识符命名

3-1:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。
3-2:命名中若使用特殊约定或缩写,则要有注释说明。
3-3:命名风格统一,请遵守下面规范:

  1. )文件名以大写字母开头,如果文件名包含多个单词,每个单词首字母大写,例如 SimpleSearcher?.c

-2)对于结构体的定义:TG_name,其中name自己定义,首字母大写,如果是指针定义为:TG_pname,其中name
自己定义,首字母大写
-

  1. )在头文件前的声明时,统一为:如对于head.h,定义为:_HEAD_H,,即.#ifndef _HEAD_H

3-4:对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。
3-5: 变量名称和函数名称全部小写,多个单词以下划线分开,例如 search_poi, tile_buffer。

4.可读性

4-1:注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
4-2:避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的枚举或宏来代替。

5.变量

5-1:去掉没必要的公共变量。
5-2:仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系。
5-3:明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创建等。
5-4:当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生。
5-5:防止局部变量与公共变量同名。
5-6:不要使用未经初始化的变量作为右值。

6.函数、过程

6-1:对所调用函数的错误返回码要仔细、全面地处理。
-6-2:明确函数功能,精确(而不是近似)地实现函数设计。-
6-3:编写可重入函数时,应注意局部变量的使用(如编写C/C++语言的可重入函数时,应使用auto即缺省态局部变量或寄存器变量)。
6-4:编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。

7.可测性(这部分需要更新)

7-1:在同一项目组或产品组内,要有一套统一的为集成测试与系统联调准备的调测开关及相应打印函数,并且要有详细的说明。
7-2:在同一项目组或产品组内,调测打印出的信息串的格式要有统一的形式。信息串中至少要有所在模块名(或源文件名)及行号。
7-3:编程的同时要为单元测试选择恰当的测试点,并仔细构造测试代码、测试用例,同时给出明确的注释说明。测试代码部分应作为(模块中的)一个子模块,以方便测试代码在模块中的安装与拆卸(通过调测开关)。
7-4:在进行集成测试/系统联调之前,要构造好测试环境、测试项目及测试用例,同时仔细分析并优化测试用例,以提高测试效率。
7-5:使用断言来发现软件问题,提高代码可测性。
7-6:用断言来检查程序正常运行时不应发生但在调测时有可能发生的非法情况。
7-7:不能用断言来检查最终产品肯定会出现且必须处理的错误情况。
7-8:对较复杂的断言加上明确的注释。
7-9:用断言确认函数的参数。
7-10:用断言保证没有定义的特性或功能不被使用。
7-11:用断言对程序开发环境(OS/Compiler/Hardware)的假设进行检查。
7-12:正式软件产品中应把断言及其它调测代码去掉(即把有关的调测开关关掉)。
7-13:在软件系统中设置与取消有关测试手段,不能对软件实现的功能等产生影响。
7-14:用调测开关来切换软件的DEBUG版和正式版,而不要同时存在正式版本和DEBUG版本的不同源文件,以减少维护的难度。
7-15:软件的DEBUG版本和发行版本应该统一维护,不允许分家,并且要时刻注意保证两个版本在实现功能上的一致性。

8.质量保证

8-1:过程/函数中分配的内存,在过程/函数退出之前要释放。
8-2:过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭。
8-3:系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。
8-4:系统运行之初,要对加载到系统中的数据进行一致性检查。
8-5:有可能的话,if语句尽量加上else分支,对没有else分支的语句要小心对待;
8-6: switch语句必须有default分支。
8-7: 禁止GOTO语句。
8-8:单元测试是编程的一部份,提交联调测试的程序必须通过单元测试。

9.宏

12-1:用宏定义表达式时,要使用完备的括号。
12-2: 将宏所定义的多条表达式放在大括号中。
12-3: 使用宏时,不允许参数发生变化

原创粉丝点击