Google C++ 风格指南包含顺序

Google C++ Style Guide include order

Google C++ Style Guide 建议按以下顺序将 header 文件 (.h) 包含到实现文件 (.cpp, .cc) 中:

In dir/foo.cc or dir/foo_test.cc, whose main purpose is to implement or test the stuff in dir2/foo2.h, order your includes as follows:

dir2/foo2.h.
A blank line
C system files.
C++ system files.
A blank line
Other libraries' .h files.
Your project's .h files.

如前所述,这样的顺序允许在编译 foo 单元时看到 dir2/foo2.h 中省略的依赖项,而不是其他无辜的单元。似乎很符合逻辑。

但为什么 Other libraries' .h files.Your project's .h files. 放在列表的末尾?从理论上讲,也可能存在缺失的依赖项,这些依赖项将通过在之前包含 C system files.C++ system files. 来隐藏。

也许假设其他(header)文件问题应该在相关的实现文件中检测到?在那种情况下,header-only 图书馆呢?

换句话说,将包含以下顺序:

dir2/foo2.h.
A blank line
Other libraries' .h files.
Your project's .h files.
A blank line
C system files.
C++ system files.

更快地找到隐藏的依赖项会更好吗?

例如,如果我只有 header 需要 <stdio.h>(但未在该文件中指定)。使用 Google 命令直接或间接包含 <stdio.h> 的概率高于在最后一步包含系统文件时的概率(正如我之前建议的那样)。因此,找到隐藏依赖项的可能性很低。那么,如果在其他 lib/your 项目文件之前包含系统文件,我们将获得什么?

还不清楚,我是否应该在其他(用户定义的)header 文件中使用推荐的包含文件顺序。

要包含的 C 和 C++ header 文件是下面源代码使用的文件,它们不应涵盖其他库或项目的 header 文件的依赖项。

而header只有模板之类的模块:你确实为你的模块写了一个测试程序,对吧?首先在测试程序中包含模板 header 文件,然后您也可以在那里检测缺少的包含。

每个 header 文件(h、hpp、...)都应该有一个实现文件(cpp、cc、...),其中包含的顺序与问题中指定的顺序相同。 (即使实现文件是空的,除了这1个include)

所以就像 "Your" header 首先包含在 "Your" 实现文件中一样,所以每个 "other" header 文件都应该首先包含在 "other"实现文件。

这样,如果 "other" header 不包含必需的 header,"other" 实现文件将不会编译。