背景
使代码保存一致性,让程序员都可以快速读懂你的代码这点非常重要。保持统一编程风格并遵守约定意味着可以很容易根据“模式匹配”规则来推断各种标识符的含义。创建通用,习惯用语和模式可以使代码更容易理解。
1 . 头文件
所有头文件都应该使用 #define 防止头文件被多重包含, 命名格式当是:<PROJECT>_<PATH>_<FILE>_H_
例如:
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
…
#endif //FOO_BAR_BAZ_H_
2. 函数
定义函数时, 参数顺序依次为: 输入参数, 然后是输出参数。
输入参数一般传值或传const引用,输出参数或输入/输出参数则是非-const指针。对参数排序时, 将只输入的参数放在所有输出参数之前。尤其是不要仅仅因为是新加的参数, 就把它放在最后;即使是新加的只输入参数也要放在输出参数。
3.源文件
源文件中包含头文件的次序如下:
1. dir2/foo2.h (优先位置, 详情如下)
2. C 系统文件
3. C++ 系统文件
4. 其他库的 .h 文件
5. 本项目内 .h 文件
4. 作用域
将函数变量尽可能置于最小作用域内, 并在变量声明时进行初始化.
// 低效的实现
for (int i = 0; i < 1000000; ++i){ //大括号不采用这种方式
Foo f; // 构造函数和析构函数分别调用1000000 次!
f.DoSomething(i);
}
//正确实现
Foo f; // 构造函数和析构函数只调用 1 次
for (int i = 0; i < 1000000; ++i)
{
f.DoSomething(i);
}
不考虑返回值的话, 前置自增 (++i) 通常要比后置自增 (i++) 效率更高. 因为后置自增 (或自减) 需要对表达式的值i 进行一次拷贝. 如果 i是迭代器或其他非数值类型, 拷贝的代价是比较大的. 既然两种自增方式实现的功能一样, 为什么不总是使用前置自增呢?
5.命名约定(匈牙利命名法)
开头字母用变量类型的缩写,其余部分用变量的英文或英文的缩写,要求单词第一个字母大写。
ex:
int iMyAge; “i”是int类型的缩写;
char cMyName[10]; “c”是char类型的缩写;
float fManHeight; “f”是float类型的缩写;
常量及宏的命名,采用下划线分割大写字母的方式命名,一般应以设备名作为前缀,
防止模块间命名的重复。如:
#defineTIMER0_MODE_RELOAD 2
#defineTIMER2_COUNT_RETRIEVE(val) ((uint16)(65536 - (val)))
4.注释
注释虽然写起来很痛苦, 但对保证代码可读性至关重要。 下面的规则描述了如何注释以及在哪儿注释。当然也要记住: 注释固然很重要, 但最好的代码本身应该是自文档化。有意义的类型名和变量名, 要远胜过要用注释解释的含糊不清的名字。代码有更改,注释应及时更新。
函数声明:
注释位于声明之前, 对函数功能及用法进行描述。 注释使用叙述式,注释只是为了描述函数, 而不是命令函数做什么。
函数的输入输出.
Ø 对类成员函数而言: 函数调用期间对象是否需要保持引用参数, 是否会释放这些参数.
Ø 如果函数分配了空间, 需要由调用者释放.
Ø 参数是否可以为 NULL.
Ø 是否存在函数使用上的性能隐患.
Ø 如果函数是可重入的, 其同步前提是什么?
变量声明:
所有全局变量,静态变量,需要注释说明含义及用途。
5.其他
格式:工整,对齐,紧凑,文件,统一utf-8
附录:
原词 缩写
addition add 加
subtraction sub 减
multiplication mul 乘法
division div 除法
answer ans 响应、回答
array arr 数组、集合
average avg 平均
buffer buf或buff 缓冲区
capture cap或capt 捕获
check chk 检查
count cnt 计数器
column col 列
control ctrl 控制
decode dec 解码、译码
define def 定义
delete del 删除
destination dst或dest 目的
display disp 显示
encode enc 编码
environment env 环境
error err 错误
float flt 浮动、浮点
frequency freq 频率
header hdr 开始、开头
index idx 索引、指示、
image img 影像、镜像
increment inc 增加、增量
initalize init 初始化
iteration itr 循环、迭代
length len 长度
memory mem 内存
middle mid 中值
make mk 制造、形成
message msg 消息
number num 数量、编号
operand opnd 操作数
optimization opt 最优
operator optr 操作
packet pkt 消息包
positon pos 位置
previous pre或prev 以前的
pointer ptr 指针
record rcd 记录
receive recv 收到、接收
result res 结果
return ret 返回
source src 源头
stack stk 栈
string str 字符串
table tab 表
temporary tmp或temp 临时
total tot 全部的
time stamp ts 时间戳
value val 值