Self-contained 头文件

头文件应该能够自给自足(self-contained,也就是可以作为第一个头文件被引入),以 .hpp 结尾。至于用来插入文本的文件,说到底它们并不是头文件,所以应以 .inc 结尾。不允许分离出 -inl.h 头文件的做法.

#define 保护

所有头文件都应该有 #define 保护来防止头文件被多重包含, 命名格式当是: <PROJECT>_<PATH>_<FILE>_H_ .

例如: 项目 foo 中的头文件 foo/src/bar/baz.h 可按如下方式保护:

  1. #ifndef FOO_BAR_BAZ_H_
  2. #define FOO_BAR_BAZ_H_
  3. ...
  4. #endif // FOO_BAR_BAZ_H_

前置声明

尽可能地避免使用前置声明。使用 #include 包含需要的头文件即可。

结论:

  • 尽量避免前置声明那些定义在其他项目中的实体.
  • 函数:总是使用 #include.
  • 类模板:优先使用 #include.

内联函数

只有当函数只有 10 行甚至更少时才将其定义为内联函数.

#include 的路径及顺序

使用标准的头文件包含顺序可增强可读性, 避免隐藏依赖: 相关头文件 > C 库 > C++ 库 > 其他库的 .h > 本项目内的 .h.

例外:

有时,平台特定(system-specific)代码需要条件编译(conditional includes),这些代码可以放到其它 includes 之后。当然,您的平台特定代码也要够简练且独立,比如:

  1. #include "foo/public/fooserver.h"
  2. #include "base/port.h" // For LANG_CXX11.
  3. #ifdef LANG_CXX11
  4. #include <initializer_list>
  5. #endif // LANG_CXX11