命名规则
函数命名, 变量命名, 文件命名要有描述性; 少用缩写
文件命名
文件名要全部小写, 可以包含下划线
_
或连字符-
, 依照项目的约定. 如果没有约定, 那么_
更好.
类命名
类名称的每个单词首字母均大写, 不包含下划线:
MyExcitingClass
,MyExcitingEnum
.
变量命名
变量 (包括函数参数) 和数据成员名按小驼峰规则, 除第一个单词外其他单词首字母大写. 类的成员变量以下划线开头, 但结构体的就不用, 如:
aLocalVariable
,aStructDataMember
,_aClassDataMember.
常量命名
声明为 constexpr 或 const 的变量, 或在程序运行期间其值始终保持不变的, 命名时以 “k” 开头, 大小写混合. 例如:
const int kDaysInAWeek = 7;
函数命名
常规函数使用大小写混合, 取值和设值函数则要求与变量名匹配:
myExcitingFunction()
,myExcitingMethod()
命名空间命名
命名空间以小写字母命名. 最高级命名空间的名字取决于项目名称. 要注意避免嵌套命名空间的名字之间和常见的顶级命名空间的名字之间发生冲突.
枚举命名
枚举的命名使用大驼峰规则: EnumName
宏命名
你并不打算 使用宏, 对吧? 如果你一定要用, 像这样命名: MY_MACRO_THAT_SCARES_SMALL_CHILDREN
格式
非 ASCII 字符
尽量不使用非 ASCII 字符, 使用时必须使用 UTF-8 编码.
空格还是制表位
只使用空格, 每次缩进 4 个空格.
函数声明与定义
- 使用好的参数名.
- 只有在参数未被使用或者其用途非常明显时, 才能省略参数名.
- 如果返回类型和函数名在一行放不下, 分行.
- 如果返回类型与函数声明或定义分行了, 不要缩进.
- 左圆括号总是和函数名在同一行.
- 函数名和左圆括号间永远没有空格.
- 圆括号与参数间没有空格.
- 左大括号总在最后一个参数同一行的末尾处, 不另起新行.
- 右圆括号和左大括号间总是有一个空格.
- 所有形参应尽可能对齐.
- 缺省缩进为 4 个空格.
- 换行后的参数保持 4 个空格的缩进.
Lambda 表达式
Lambda 表达式对形参和函数体的格式化和其他函数一致; 捕获列表同理, 表项用逗号隔开.
指针和引用表达式
句点或箭头前后不要有空格. 指针/地址操作符 (*, &) 之后不能有空格.
预处理指令
预处理指令不要缩进, 从行首开始.
类格式
访问控制块的声明依次序是 public:, protected:, private:, 每个都缩进 4 个空格.
构造函数初始值列表
构造函数初始化列表放在同一行或按四格缩进并排多行.
命名空间格式化
命名空间内容不缩进.
注释
注释风格
使用 // 或 / /, 统一就好.
文件注释
在每一个文件开头加入版权公告.
类注释
每个类的定义都要附带一份注释, 描述类的功能和用法, 除非它的功能相当明显.
例如:
// Iterates over the contents of a GargantuanTable.
// Example:
// GargantuanTableIterator* iter = table->NewIterator();
// for (iter->Seek("foo"); !iter->done(); iter->Next()) {
// process(iter->key(), iter->value());
// }
// delete iter;
class GargantuanTableIterator {
...
};
函数注释
函数声明处的注释描述函数功能; 定义处的注释描述函数实现.
- 函数的输入输出.
- 对类成员函数而言: 函数调用期间对象是否需要保持引用参数, 是否会释放这些参数.
- 函数是否分配了必须由调用者释放的空间.
- 参数是否可以为空指针.
- 是否存在函数使用上的性能隐患.
- 如果函数是可重入的, 其同步前提是什么?
TODO 注释
TODO 注释要使用全大写的字符串 TODO, 在随后的圆括号里写上你的名字, 邮件地址或其它身份标识和与这一 TODO 相关的 issue
// TODO(kl@gmail.com): Use a "*" here for concatenation operator.
弃用注释
通过弃用注释(DEPRECATED comments)以标记某接口点已弃用.