大师包含文件 - 好的或坏的练习

时间:2013-03-27 16:41:28

标签: c++ c

我见过很多项目(通常是游戏引擎),其中所有标题包括放在单个头文件中,有时也包含宏等。

// Master.h

#include "header1.h"
#include "header2.h"
#include "header3.h"
.
.
#include "headerN.h"

然后在使用代码时,标准将只包含Master.h文件。

其他项目的工作原理是源文件应仅包含所需的标题。

我想知道的是,对于最佳实践是否存在确定的答案,最好是具有可衡量的结果,还是个人偏好?

6 个答案:

答案 0 :(得分:7)

大多数答案都提到了编译时,忽略了这样一个事实,即标头的预编译具有巨大的编译时间优势,并且使用主标头技术可以更好地工作。

最好,如果直接包含没有主头文件,那么您的标题应该有效(这使得测试更容易)。现代编译器优化了“跳过头文件,如果包含多个”逻辑。

答案 1 :(得分:2)

从编译时间的角度来看,

绝对是一种不好的做法,因为每次修改文件或触摸任何包含的标题时,都必须从头开始重新编译项目。

根据经验,您应该在源文件中包含尽可能少的标题。 但是我可以看到一些情况,这可能会派上用场,第三方库不会经常改变

答案 2 :(得分:2)

由于编译C ++是昂贵的并且可能特别慢,我会说如果有很多头文件(或者有很多头文件),可以通过避免不必要的包含未使用的头来避免一些额外的预处理和解析时间实现文件,其中包括标题)。

这是为了实现库(你指的是游戏引擎让我觉得我们在这里讨论的是库)。现在你可以创建一个“主”包含文件,以方便那些人使用库并希望在一个地方放置所有东西(并且不会同时拥有数千个文件)。

答案 3 :(得分:1)

我还要补充说,当库提供一个主要的时,只包含所需的标题是一个相当糟糕的主意。经常发生这样的标题不包括它需要的所有内容,而是取决于主标题将包括之前所有必需标题的事实。所以,如果你是图书馆的用户,你通常没有多少选择,应该按照作者的建议。

这也是为什么将主标题视为不良做法的原因 - 这使得检测上述情况变得更加困难。

答案 4 :(得分:0)

在我看来,通过不键入正确的头文件的名称而获得的5秒肯定不值得这种方法引起的编译时间的巨大增加。

我说这是不好的实践。

然而,正如H2CO3所说,提供将主头文件用于框架的最终用户的可能性非常有用。如果我记得很清楚,GTK会这样做。

答案 5 :(得分:0)

我认为C ++中的一些问题 - 以及这个问题 - 您可以通过记住C ++“口头禅”来回答自己

  

不支付你不使用的东西。

尽可能保存用户(即代码/库的使用者)的计算成本(运行时和编译时)。不要污染命名空间,并在编译器(也在语法高亮显示器等)上投入比需要更多的东西。我认为这是C ++的礼貌方式:)