谷歌 C++ 代码风格
1. 格式
1.1. 行长
- 一行最多 80 列
1.2. 非 ASCII 字符
- 少用非 ASCII 字符,文件编码必须是 UTF-8
1.3. 空格
- 通常,缩进 2 个空格,不用 TAB
1.4. 函数声明和定义
- 参数列表换行时,要么和上一行参数对齐,要么缩进 4 个空格
- 参数列表的左圆括号
(
始终与函数名在同一行 - 函数体的左花括号
{
始终和函数声明尾部在同一行,而不是另起一行 - 函数体的右花括号
}
要么结尾独占一行,要么和左括号{
在同一行(空函数体或者超简单的函数?类似 lambda 表达式?) - 不使用的参数,可以省略名字,或者把名字行内注释掉
/* */
1.5. Lambda 表达式
- 要指定捕获的数据类型
&
紧挨着变量名
1.6. 浮点数字面量
- 浮点数字面量一定要有小数点,且小数点两侧都要有数字
- 指数形式的也一样(指数表示一定是浮点数字面量而不是整数字面量)
1.7. 类
public
、protected
和private
前,一个空格的缩进
1.8. 初始化列表
- 要么一行,要么
:
缩进 4 个空格,后续行的变量对齐 - 左花括号
{
始终和初始化列表最后一行在一起
1.9. 命名空间
- 命名空间用花括号
{}
包围,左右花括号不在同一行,和内容之间空一行,命名空间不占额外的缩进
1.10. 水平空白
- 注释前 2 空格
else
和花括号在同一行
2. 注释
- 建议全部使用
//
注释,当然也可以用/* */
,坚持习惯就好 - 类和函数接口应该注释功能和用法示例
- 如果涉及同步、多线程访问,注释要说明用法和异同
- 如果有划分
.h
和.cc
,使用方法在.h
注释,实现细节在.cc
注释 - 全局变量需要注释说明是什么,用于干什么,可能还要说明为什么是全局变量
- 函数调用中,模糊不清容易引起疑惑的参数,可以注释一下,比如
/* ... */nullptr
- 不要描述代码干了什么,而是解释为什么要这么做,或者让代码自解释
- TODO 只是临时的解决方法,后续要改的,标清楚邮箱、作者,或者 bug ID 等信息,如果是未来要做的事情的注释,请标清楚具体日期
3. 命名
- 文件名:小写字母 + 下划线,
.h
,.cc
,.inc
- 类名:大驼峰,最好和文件名一致,比如
FooBar
类在文件foo_bar.cc
中 - 类型:大驼峰
- 变量:小写字母 + 下划线
- 类数据成员:常规变量名 + 尾部下划线
- 结构体数据成员:常规变量名
- 常量:
k
开头的小驼峰,大小写字母不能明确分割的地方,可以用_
分割 - 函数:大驼峰
- 命名空间:小写字母 + 下划线
- 枚举变量:类型名同类名,枚举量同常量
- 宏:大写字母 + 下划线
4. 头文件
- 头文件自包含
#define
保护,宏名 + 尾部下划线- 避免使用 forward declaration,任何在当前文件中没有关联定义的,都可以声明,类、函数、外部变量等,不用
#include
,跳过编译,这会导致很多问题 - 包含顺序:类相关头文件、C 系统头文件、C++ 标准库头文件、其它库头文件、你工程的头文件,各类头文件之间加空行,条件包含的,放在后面,并且尽可能小、局部
This post is licensed under CC BY 4.0 by the author.