1.头文件更改会导致所有直接或间接包含该头文件的的C文件重新编译,会增加大量编译工作量,延长编译时间,因此:
1.1 头文件里尽量少包含头文件
1.2 头文件应向稳定的方向包含
2.每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口
3.所有头文件都应当使用#define 防止头文件被多重包含,命名格式为FILENAME_H,为了保证唯一性,更好的命名是PROJECTNAME_PATH_FILENAME_H。注意最前面没有'_'或'__',因为一般以单下划线"_"和双下划线"__"开头的标识符为ANSI C等使用
4.只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c中通过extern的方式使用外部函数接口、变量
5. 一个模块通常包含多个.c文件,建议放在同一个目录下,目录名即为模块名。为方便外部使
用者,建议每一个模块提供一个.h,文件名为目录名
6.避免函数过长,新增函数不超过50行(非空非注释行),过长的函数往往意味着函数功能不单一,过于复杂
7.避免函数的代码块嵌套过深,新增函数的代码块嵌套不超过4层
8.在带操作系统编程时,全局变量和静态变量都属于共享资源,在使用时都得做互斥处理,因此函数中尽量少使用全局变量和静态变量,一旦使用将会使该函数的可重入性大大降低
9.设计高扇入,合理扇出(小于7)的函数,扇出表示该函数内部调用其它函数的数目
10.标识符命名规则建议使用unix like风格:单词用小写字母,每个单词直接用下划线„_‟分割,例 如text_mutex
11.文件命名统一采用小写字符,因为不同系统对文件名大小写处理会不同(如MS的DOS、Windows系统不区分大小写,但是Linux系统则区分)
12.全局变量应增加“g_”前缀,静态变量应增加“s_”前缀
13. 一个变量只有一个功能,不能把一个变量用作多种用途
14.建议定义一个STATIC宏,在调试阶段,将STATIC定义为static,版本发布时,改为空,以便于后续的打补丁等操作。
15.用宏定义表达式时,要使用完备的括号,如#define RECTANGLE_AREA(a, b) a * b 应该定为 #define RECTANGLE_AREA(a, b) ((a) * (b))
16.当宏定义中涉及多个表达式时,最好用do{}while(0)包含
17.使用宏和函数时,不允许参数发生变化,如:
#define SQUARE(a) ((a) * (a))
int a = 5;
int b;
b = SQUARE(a++); // 结果:a = 7,即执行了两次增
18.除非必要,应尽可能使用函数代替宏
19.常量建议使用const定义代替宏:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分;宏定义的标志字符/符号编译器是看不到的,因为已经被预处理器处理掉了,所以在编译报错或调试时是完全看不到这个符号的,如定义了一个数字,你只看得到数字本身,因此很不利于调试
20.代码质量保证优先原则
(1)正确性,指程序要实现设计要求的功能。
(2)简洁性,指程序易于理解并且易于实现。
(3)可维护性,指程序被修改的能力,包括纠错、改进、新需求或功能规格变化的适应能力。
(4)可靠性,指程序在给定时间间隔和环境条件下,按设计要求成功运行程序的概率。
(5)代码可测试性,指软件发现故障并隔离、定位故障的能力,以及在一定的时间和成本前提下,进
行测试设计、测试执行的能力。
(6)代码性能高效,指是尽可能少地占用系统资源,包括内存和执行时间。
(7)可移植性,指为了在原来设计的特定环境之外运行,对系统进行修改的能力。
(8)个人表达方式/个人方便性,指个人编程习惯。
21.禁止内存操作越界,尤其在使用字符串时,字符串默认都是以'\0'(即0x00)结尾的,在使用/操作字符串时,注意有没有'\0'结尾,建议使用限制字符数量的字符串操作函数代替一些危险函数,如:用strncpy()代替strcpy();用strncat()代替strcat();用snprintf()代替sprintf()
22.禁止内存泄漏,如忘记释放内存
23.对于多维大数组,避免来回跳跃式访问数组成员。
24.优秀的代码可以自我解释,不通过注释即可轻易读懂。优秀的代码不写注释也可轻易读懂,注释无法把糟糕的代码变好,需要很多注释来解释的代码往往存在坏味道,需要重构。
25.文件头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者姓名、工号、内
容、功能说明、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。
26.全局变量要有较详细的注释,包括对其功能、取值范围以及存取时注意事项等的说明。
27.注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,
除非能用非常流利准确的英文表达。对于有外籍员工的,由产品确定注释语言。
28.多个短语句(包括赋值语句)不允许写在同一行内,即一行只写一条语句
29.if、for、do、while、case、switch、default等语句独占一行
30.产品代码中经常有如下代码:
int foo()
{if (异常条件) { 异常处理;return ERR_CODE_1;}if (异常条件){ 异常处理;return ERR_CODE_2;}正常处理;return SUCCESS;
}
int foo()
{ if (满足条件) { 正常处理; return SUCCESS; } else if (概率比较大的异常条件) { 异常处理;return ERR_CODE_1; } else{ 异常处理;return ERR_CODE_2; }
}
句不会再运行