编码规范
- ANSI 编码(文件名、注释、Log、Git commit 都使用英文)
- 一行一条语句
- 行长度:一行代码长度小于编辑器一行可视范围,超长使用 ‘\\’
- 缩进:统一采用 4 个空格,避免使用 Table
- 换行:统一使用 Windows 风格,”\r\n”
- 圆括号:含有较多运算符、宏定义,使用圆括号避免运算符优先级问题
- for循环:for语句的初始化或更新子句中使用逗号时,避免使用三个以上的变量。若确实需要,可以在for循环之前初始化,或for循环末尾使用单独的语句
- 灵活使用 const、static
- 禁止调用 exit 等终止程序类代码
switch语句
- switch语句中必须包含default分支
- 每个分支必须包含break
- 命中率高的case分支写在命中率低的分支前面
初始化
- 在声明局部变量的同时初始化
- 禁止直接使用未定义变量
- 避免使用空指针
- 避免在一个语句中给多个变量赋相同的值 (
foo_bar.fchar = bar_foo.lchar = 'c';
) - 避免赋值运算放置于判断中 (
if(a = b)
) - 避免使用内嵌(embedded)赋值运算符试图提高运行时的效率,这是编译器的工作(
d = (a = b + c) + r;
)
指针使用
- 定义指针的时候必须要初始化
- 指针使用之前需要判断其是否为空
- 动态分配的内存一定要释放,并且释放后的指针需要设置为空
- 使用指针需要注意内存的分配和边界
花括号{}
- if/for/while 不可缺省(哪怕只有一行)
- 块包含
- 如果存在else if分支,则禁止省略else分支
空格,应用于下列情况:
- 运算符前后
- 非行尾的分号’;’ 逗号’,’之后
- ‘(’之后,’)’之前
空行,用于将逻辑关联度相对较低的代码段分隔,应用于下列情况:
- 两个函数之间
- 函数内的局部变量和第一条语句之间
- 块注释前后
- 函数内明显的逻辑不同
注释
- 若有多个短注释出现在一大段代码中,它们应该具有相同的缩进
文档注释
1
2
3
4
5/**
*@func 说明 ...
*@author 作者
date 日期
*/函数注释
1
2
3
4
5
6
7
8/**
*@func 说明 ...
*@param 类型 变量1 说明
*@param 类型 变量2 说明
*@return 说明
*@autuor 作者
*@date 日期
*/- review注释,reviewer在code review时如果发现代码中的问题,在问题代码前一行添加注释,说明问题,供开发人员参考使用;开发人员在更正问题后记录更正时间和作者。
1
2
3
4
5/*
*<code_review> date codereviewer
*<question> 问题描述
*<update> data developer[附加说明]
*/命名规范
采用统一命名( 文件名、函数名、变量名、结构体名、宏值 )
- 命名简洁,命名要能表达出函数的用途,统一使用英文单词或常用缩写,禁止拼音
- 函数、变量:驼峰式( getVolume )、小写+下划线( get_volume )
- 结构体、宏:大写+下划线( MAX_LENGTH )
- 函数名、结构体、全局变量、宏:使用模块名作为统一前缀,如 “nn_”
- 全局变量用 “g_” 作为前缀,控制全局变量数量,要加详细的注释说明
- 公用函数声明在 .h 文件中,使用 extern 修饰符
- 私用函数声明在 .c 文件中,使用 static 修饰符
常用后缀
- max — 含义为某实体所能赋予的最大值(retry_max //最多重试次数)
- count — 一个运行中的计数变量的当前值(retry_count //当前重试次数)
- key — 键值
常用前缀
- is – 含义为代表一个问题,将获取答案(is_mute //是否静音)
- get — 含义为取得一个数值
- set — 含义为设定一个数值
Log规范
- 出错类Log(必需) + 调试类Log(可通过宏控制)
- LOG_TAG ( __FUNCTION__, __LINE__ )