Google规范线上地址:
https://zh-google-styleguide.readthedocs.io/en/latest/
文章目录
- 1. 头文件
- 2. 作用域
- 3. 类
- 4. 函数
- 5. 其他C++特性
- 6. 命名约定
- 7. 注释
- 8. 格式
1. 头文件
每个cpp
/cc
文件都对应一个h头文件,除单元测试代码和只包含main()
的文件外。
所有头文件都应该有 #define
保护来防止头文件被多重包含,命名格式:<PROJECT>_<PATH>_<FILE>_H_
,如:
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif // FOO_BAR_BAZ_H_
当函数被声明为内联函数后,编译器会将其内联展开,而不是按通常的函数调用机制进行调用。(注意:只有当函数只有 10 行或者更少时才将其定义为内联函数)
使用标准的头文件包含顺序可增强可读性,避免隐藏依赖,顺序如下:相关头文件, C 库, C++ 库,其他库的.h,本项目内的.h
。
2. 作用域
命名空间将全局作用域细分为独立的,具名的作用域,可有效防止全局作用域的命名冲突。另外,一般在命名空间的最后注释出命名空间的名字。
3. 类
类是 C++ 中代码的基本单元。
在构造函数中可以进行各种初始化操作。
仅当只有数据成员时使用 struct
,其它一概使用 class
。
接口是指满足特定条件的类,这些类以 Interface
为后缀 (不强制)。
4. 函数
函数使用时倾向于按值返回,否则按引用返回。避免返回指针,除非它可以为空。
函数最好简短、凝练,避免拖长尾。
所有按引用传递的参数必须加上const
。
若要使用函数重载,则必须能让读者一看调用点就胸有成竹,而不用花心思猜测调用的重载函数到底是哪一种,这一规则也适用于构造函数。
5. 其他C++特性
禁止使用 C++ 异常。
使用 C++ 的类型转换,如 static_cast<>()
。不要使用 int y = (int)x 或 int y = int(x)
等转换方式。
强烈建议你在任何可能的情况下都要使用 const
. 此外有时改用 C++11 推出的 constexpr 更好。
C++ 没有指定整型的大小。通常人们假定 short 是16位,int是32位,long是32位,long long是64位。
适当使用 lambda
表达式。别用默认 lambda 捕获,所有捕获都要显式写出来。
只使用 Boost
中被认可的库。
6. 命名约定
函数命名,变量命名,文件命名要有描述性,少用缩写。
文件名要全部小写,可以包含下划线(_)
或连字符(-)
,依照项目的约定,如果没有约定,那么“”更好。
7. 注释
使用//
或/**/
,统一就好。
函数声明处的注释描述函数功能,定义处的注释描述函数实现。
函数的输入输出。
对类成员函数而言: 函数调用期间对象是否需要保持引用参数, 是否会释放这些参数。
函数是否分配了必须由调用者释放的空间。
参数是否可以为空指针。
是否存在函数使用上的性能隐患。
如果函数是可重入的, 其同步前提是什么?
通常变量名本身足以很好说明变量用途。某些情况下,也需要额外的注释说明。
8. 格式
每一行代码字符数不超过80。
尽量不使用非 ASCII
字符,使用时必须使用UTF-8
编码。
只使用空格,每次缩进2个空格。
倾向于不在圆括号内使用空格,关键字 if
和 else
另起一行。
switch
语句可以使用大括号分段,以表明 cases
之间不是连在一起的。在单语句循环里,括号可用可不用。空循环体应使用{}或 continue
。
最后,请注意项目整体代码风格尽量保持一致,这样可以把精力集中在实现内容而不是表现形式上。
以上。