大型项目的C++头策略(redux)

10 c++ header include

我已经阅读了有关此主题的所有内容,包括本网站上的一些非常有用的讨论,NASA编码指南和Google C++指南.我甚至买了这里推荐的"物理C++设计"书(对不起,忘记了名字)并从中得到了一些有用的想法.大多数消息来源似乎都同意 - 头文件应该是自包含的,即它们包含他们需要的内容,以便cpp文件可以包含头而不包括任何其他文件并且它将编译.我也得到关于前方声明的观点,而不是尽可能包括在内.

那说,如果foo.cpp包括bar.hqux.h,但事实证明它bar.h本身包括qux.h?那么应该foo.cpp避免包括qux.h?亲:清理foo.cpp(减少"噪音").Con:如果有人将bar.h更改为不再包含qux.h,则foo.cpp神秘地开始无法编译.也导致依赖关系,foo.cppqux.h不是显而易见的.

如果您的答案是"cpp文件应该#include它需要的每个标题",那么就会得出它的逻辑结论,这意味着几乎每个cpp文件都必须#include <string>, <cstddef>等等,因为大多数代码最终会使用它们,如果你不是应该依赖包括它们在内的其他一些标题,你的cpp需要明确地包含它们.这似乎是cpp文件中的很多"噪音".

思考?

以前的讨论:

有哪些技术可以限制C++项目中的编译依赖性?

您对大项目的首选C/C++标头策略?

如何自动查找未使用的#include指令?

ETA:受到此前讨论的启发,我编写了一个Perl脚本来连续注释掉每个'include'和'using',然后尝试重新编译源文件,找出不需要的东西.我还想出了如何将它与VS 2005集成,因此您可以双击以转到"未使用"包含.如果有人想要它让我知道......现在非常实验.

Mic*_*urr 8

如果你的答案是"cpp文件应该是#include它需要的每个标题",那么就得出它的逻辑结论,这意味着几乎每个cpp文件都必须#include <string>, <cstddef>等等,因为大多数代码最终会使用那些,如果你不应该依赖包括它们在内的其他一些标题,你的cpp需要明确地包含它们.

对.这就是我喜欢它的方式.

如果"噪音"太多无法承受,那么可以使用包含通常的常用包含的"全局"包含文件(如stdafx.h在许多Windows程序中),并在每个.cpp文件的开头包含该文件(这也有助于预编译头文件).

  • 我可以理解为什么你不想使用stdafx.h模式,但它可以工作,这是一个我不认为"坏形式"的模式.此外,我不会主张将所有东西和厨房水槽扔进stdafx标头 - 只是**真正**的标头几乎无处不在..cpp文件仍然可以包含stdaf.h文件之后不太常用的其他标头.而且我认为我不担心多次包含其他必要的标题 - 它们不应该影响构建时间太多(后续包含的文件将不会被处理). (2认同)