谷歌开源项目代码风格:C++
命名约定
- 文件命名:文件名应全部小写,可包含下划线(_)或连字符(-)。例如,
my_useful_class.cc
。 - 类型命名:类型名称(包括类、结构体、类型定义、枚举、类型模板参数)的每个单词首字母大写,不包含下划线。例如,
MyExcitingClass
。 - 变量命名:变量名(包括函数参数)和数据成员名全部小写,单词之间用下划线连接。类的数据成员以下划线结尾,结构体的则不用。例如,
a_local_variable
,a_class_data_member_
。 - 常量命名:用
k
开头,大小写混合。例如,kDaysInAWeek
。 - 函数命名:常规函数使用大小写混合,取值和设值函数则要求与变量名匹配。例如,
MyExcitingFunction()
,my_exciting_member_variable()
。 - 命名空间命名:命名空间以小写字母命名,顶级命名空间的名字取决于项目名称。例如,
myproject::mymodule
。
注释
- 文件注释:每个文件开头应包含文件内容描述。
- 类注释:每个类定义前应包含注释,描述类的功能和用法。
- 函数注释:函数声明处的注释描述函数功能;定义处的注释描述函数实现。
- 变量注释:类数据成员和全局变量应有注释说明用途。
- 实现注释:对于代码中巧妙的、晦涩的、重要的部分加以注释。
- TODO注释:使用
TODO
标记临时解决方案或不完美的代码。 - 弃用注释:使用
DEPRECATED
标记已弃用的接口,并提供替代方案。
类
- 构造函数:不在构造函数中调用虚函数,不在没有错误处理机制的情况下进行可能失败的初始化。
- 继承:通常情况下,组合比继承更合适。使用public继承,并明确使用override或final关键字限定重写的虚函数。
- 运算符重载:谨慎使用运算符重载,确保重载的运算符意义明确且符合常理。
- 访问控制:类的私有成员应声明为私有,除非是常量。
函数
- 输入和输出:倾向于按值返回,否则按引用返回。避免返回指针,除非它可以为空。
- 编写简短函数:如果函数超过40行,考虑是否可以分割。
- 函数重载:如果函数重载,应让读者一看调用点就清楚调用的是哪个重载函数。
- 缺省参数:只允许在非虚函数中使用缺省参数,且必须保证缺省参数的值始终一致。