C++风格规范(Google版)
头文件
Self-contained头文件
所有头文件要能够自给自足。即:用户和重工具不需要为特别场合而包含额外的头文件。
#defined保护
所有头文件都应该使用#define来防止头文件被多重包含,命名格式是<PROJECT>_<PATH>_<FILE>_H
。
为保证唯一性,头文件的命名应该基于所在项目源代码树的全路径。
前置声明
尽可能地避免使用前置声明。使用#include
包含需要的头文件即可。
定义
所谓前置声明(forward declaration)
是类、函数和模板的纯粹声明,没伴随着其定义。
优点:
- 前置声明能够节省编译时间,多余的
#include
会迫使编译器展开更多的文件,处理更多的输入。 - 前置声明能够节省不必要的重新编译的时间。
#inclue
使代码因头文件中无关的改动而被重新编译多次。
缺点:
- 前置声明隐依赖关系,头文件改动时,用户的代码会跳过必要的重新编译过程。
- 前置声明可能会被库的后续更改所破坏。前置声明函数或模板有时会妨碍头文件开发者变动其API。
- 前置声明来自命名空间
std::
的symbol时,其行为未定义。 - 很难判断什么时候该用前置声明,什么时候该用
#include
。极端情况下,用前置声明代替inclues
甚至都会暗暗地改变代码的含义。 - 前置声明不少来自头文件的symbol时,就会比单单一行的
include
冗长。 - 仅仅为了前置声明而重构代码,会使代码变得更慢更复杂。
结论:
- 尽量避免前置声明那些定义在其他项目中的实体。
- 函数:总是使用
#include
- 类模板:优先使用
#include