Post

谷歌 C++ 代码风格

1. 格式

1.1. 行长

  1. 一行最多 80 列

1.2. 非 ASCII 字符

  1. 少用非 ASCII 字符,文件编码必须是 UTF-8

1.3. 空格

  1. 通常,缩进 2 个空格,不用 TAB

1.4. 函数声明和定义

  1. 参数列表换行时,要么和上一行参数对齐,要么缩进 4 个空格
  2. 参数列表的左圆括号 ( 始终与函数名在同一行
  3. 函数体的左花括号 { 始终和函数声明尾部在同一行,而不是另起一行
  4. 函数体的右花括号 } 要么结尾独占一行,要么和左括号 { 在同一行(空函数体或者超简单的函数?类似 lambda 表达式?)
  5. 不使用的参数,可以省略名字,或者把名字行内注释掉 /* */

1.5. Lambda 表达式

  1. 要指定捕获的数据类型
  2. & 紧挨着变量名

1.6. 浮点数字面量

  1. 浮点数字面量一定要有小数点,且小数点两侧都要有数字
  2. 指数形式的也一样(指数表示一定是浮点数字面量而不是整数字面量)

1.7. 类

  1. publicprotectedprivate 前,一个空格的缩进

1.8. 初始化列表

  1. 要么一行,要么 : 缩进 4 个空格,后续行的变量对齐
  2. 左花括号 { 始终和初始化列表最后一行在一起

1.9. 命名空间

  1. 命名空间用花括号 {} 包围,左右花括号不在同一行,和内容之间空一行,命名空间不占额外的缩进

1.10. 水平空白

  1. 注释前 2 空格
  2. else 和花括号在同一行

2. 注释

  1. 建议全部使用 // 注释,当然也可以用 /* */,坚持习惯就好
  2. 类和函数接口应该注释功能和用法示例
  3. 如果涉及同步、多线程访问,注释要说明用法和异同
  4. 如果有划分 .h.cc,使用方法在 .h 注释,实现细节在 .cc 注释
  5. 全局变量需要注释说明是什么,用于干什么,可能还要说明为什么是全局变量
  6. 函数调用中,模糊不清容易引起疑惑的参数,可以注释一下,比如 /* ... */nullptr
  7. 不要描述代码干了什么,而是解释为什么要这么做,或者让代码自解释
  8. TODO 只是临时的解决方法,后续要改的,标清楚邮箱、作者,或者 bug ID 等信息,如果是未来要做的事情的注释,请标清楚具体日期

3. 命名

  1. 文件名:小写字母 + 下划线,.h.cc.inc
  2. 类名:大驼峰,最好和文件名一致,比如 FooBar 类在文件 foo_bar.cc
  3. 类型:大驼峰
  4. 变量:小写字母 + 下划线
  5. 类数据成员:常规变量名 + 尾部下划线
  6. 结构体数据成员:常规变量名
  7. 常量:k 开头的小驼峰,大小写字母不能明确分割的地方,可以用 _ 分割
  8. 函数:大驼峰
  9. 命名空间:小写字母 + 下划线
  10. 枚举变量:类型名同类名,枚举量同常量
  11. 宏:大写字母 + 下划线

4. 头文件

  1. 头文件自包含
  2. #define 保护,宏名 + 尾部下划线
  3. 避免使用 forward declaration,任何在当前文件中没有关联定义的,都可以声明,类、函数、外部变量等,不用 #include,跳过编译,这会导致很多问题
  4. 包含顺序:类相关头文件、C 系统头文件、C++ 标准库头文件、其它库头文件、你工程的头文件,各类头文件之间加空行,条件包含的,放在后面,并且尽可能小、局部
This post is licensed under CC BY 4.0 by the author.