C语言编码规范——着重注意点整理
编码规范的目的:
保证不同背景和经历的开发同学可以良好的协同开发
保证组织级的开发技能和经验得以共享和传承
编程最难的是命名!因为其他的算法、数据结构都有据可循。
命名完全体现了程序的可阅读性和可理解性。
1、 变量命名规范
(1) 变量命名
以字母或下划线开头,大小写字母和下划线交错命名。
(2) 前缀
静态变量 s_ 全局变量 g_ 指针变量 p_ 无符号 u_ 数组 a_ 函数指针 pf_ 枚举变量 en_ 结构体 st_ VOID v_ 32位系统下:
signed int缩写为INT或者INT32 unsigned int缩写为UINT或者UINT32。 BOOL b_XXX; CHAR c_XXX;
UCHAR uc_XXX; SHORT s_XXX; USHORT us_XXX; INT i_XXX; UINT ui_XXX; LONG l_XXX;
ULONG ul_XXX;
2、 宏定义
宏定义的命名:字母全部大写并以下划线进行分割。
宏定义是预处理时进行简单的字符替换。
宏定义没有类型,而且宏定义不分配内存
<https://www.baidu.com/s?wd=%E5%88%86%E9%85%8D%E5%86%85%E5%AD%98&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao>
。
3、 类型后缀
结构体以_S结尾:
typedef struct XXX { .... }XXX_S;
附:结构的封装一定要合理,好好利用字节对齐问题,减少空间的浪费。
枚举以_E结尾:
typedef enum XXX { .... }XXX_E;
联合体以_U结尾:
typedef union XXX { .... }XXX_U;
函数指针以_PF结尾。
4、 函数
命名规范:模块名_功能(模块字母大写,功能字母大小写交错)
函数入参可以加上IN/OUT/INOUT。
注意:
函数务必检查入参的合法性
尽量设计高扇入、合理扇出(<7)的函数。
(扇出即是调用其他函数的个数,扇入即被调用次数)
5、 文件名
文件名全小写,命名规范“模块名_功能名.文件后缀”
6、 换行/命名的缩写/代码对齐/字符间空白
7、 注释
只能使用/* */。
8、 日志打印
(1) 打印什么?
基本包括文件名、函数名、行号、错误原因、变量值等。
(2) 日志分级
DEBUG/TRACE——精确记录一些用于调试的log。
INFO——一般记录正常运行流程和状态记录。
WARN——警告,可能会出现问题的地方。
ERROR/FATAL——重点记录的错误,详细记录失败的场景、失败原因、一些关键变量值等。
9、 其他——编码安全注意点及编码效率
(1) 编码效率:全局效率、局部效率、时间效率、空间效率
注意编程中的时间和空间转换的问题,以此提高效率。
(2) 禁止使用goto语句。
(3) If else语句的嵌套尽量不超过三层。
(4) 尽量避免循环中continue、break的一起使用问题。
(5) 务必进行入参检查和申请内存的变量的释放问题。
指针的操作:
#使用前,进行合法性检查 ptr = malloc(size); if(NULL == ptr) { //处理语句; } else { //处理语句; }
#使用完指针ptr,进行释放和指针置空 free(ptr); ptr = NULL;
指针使用前,进行合法性检查(判空处理),指针使用后,释放申请的空间且指针置空。
(6) 代码复杂度的度量和控制,提高软件的可维护性。
(7) 减少CPU的切换次数,将最忙的循环放在内层。
(8) 循环中,合理放置判断语句,减少判断次数。
(9) 判断风格,if(value == variable),if(NULL == ptr)
务必注意:判断是否可能恒为真、恒为假的问题!!!
(10)避免类型的隐式转换,全部进行显示类型转换。
(11)圈复杂度一般控制在<10,必须<15。
热门工具 换一换