Google C++ Style Guide建议按以下顺序将头文件(.h)包括到实现文件(.cpp,.cc)中:
在
dir/foo.cc
或dir/foo_test.cc
中,其主要目的是实施或测试dir2/foo2.h
中的内容,请按以下顺序订购包含的内容:dir2/foo2.h. A blank line C system files. C++ system files. A blank line Other libraries' .h files. Your project's .h files.
如前所述,这样的顺序允许在编译dir2/foo2.h
单元而不是其他无辜的单元时看到foo
中省略的依赖项。看起来很合逻辑。
但是为什么将Other libraries' .h files.
和Your project's .h files.
放在列表的末尾?从理论上讲,也可能缺少依赖项,这些依赖项将通过在前面包含C system files.
和C++ system files.
而被隐藏。
也许假设应该在相关的实现文件中检测到其他(头文件)问题?在这种情况下,仅标头库呢?
换句话说,将包括以下顺序:
dir2/foo2.h. A blank line Other libraries' .h files. Your project's .h files. A blank line C system files. C++ system files.
更好地更快地找到隐藏的依赖项?
例如,如果我只有需要<stdio.h>
的标头(但在该文件中未指定)。使用Google顺序,直接或间接包含<stdio.h>
的概率要比最后一步包含系统文件时高(如我之前所建议)。因此,发现隐藏依赖性的可能性很小。那么,如果在其他lib /您的项目文件之前包含系统文件,我们将赢得什么呢?
还不清楚,我应该在其他(用户定义的)头文件中使用推荐的包含文件顺序吗?
答案 0 :(得分:2)
每个头文件(h,hpp,...)应该有一个实现文件(cpp,cc,...),其中包含的顺序与问题中指定的相同。 (即使授权文件为空,除了这1个include之外)
因此,就像“您的”标头首先包含在“您的”实现文件中一样,因此每个“其他”标头文件也应首先包含在“其他”实现文件中。
这样,如果“其他”标头不包含必需的标头,则“其他”实现文件将不会编译。
答案 1 :(得分:-1)
要包含的C和C ++头文件是下面的源代码所使用的文件,它们不应覆盖其他库或项目的头文件的依赖项。
只有标头的模块(如模板):您确实为模块编写了一个测试程序,对吗?首先在测试程序中包含模板头文件,然后您也可以在其中检测到缺少的头文件。