Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 主文件包括文件-好的或坏的做法_C++_C - Fatal编程技术网

C++ 主文件包括文件-好的或坏的做法

C++ 主文件包括文件-好的或坏的做法,c++,c,C++,C,我见过很多项目(通常是游戏引擎),其中所有的头文件都放在一个头文件中,有时还包含宏等 // Master.h #include "header1.h" #include "header2.h" #include "header3.h" . . #include "headerN.h" 然后在使用代码时,标准是只包含Master.h文件 其他项目的工作基础是源文件应该只包含它们需要的头文件 我想知道的是,对于最佳实践是否有明确的答案,最好是有可测量的结果,还是个人偏好?从编译时间的角度来看,这

我见过很多项目(通常是游戏引擎),其中所有的头文件都放在一个头文件中,有时还包含宏等

// Master.h

#include "header1.h"
#include "header2.h"
#include "header3.h"
.
.
#include "headerN.h"
然后在使用代码时,标准是只包含Master.h文件

其他项目的工作基础是源文件应该只包含它们需要的头文件


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

从编译时间的角度来看,这肯定是一个糟糕的实践,因为每次修改文件或触及任何包含的标题时,都必须从头开始重新编译项目

根据经验,您应该在源文件中包含尽可能少的头文件。
不过,我可以看到一些情况很方便,第三方LIBs不会经常改变

< p>因为编译C++很昂贵,而且速度特别慢,我认为如果有很多头文件,可以避免一些不必要的包含未使用的头文件的情况下避免额外的预处理和解析时间。(或者有很多实现文件,这些文件又包含头文件)


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

在我看来,不键入正确头文件的名称所获得的5秒肯定不值得这种方法导致编译时间的巨大增加

我认为这是一种糟糕的做法


然而,正如H2CO3所说,向框架的最终用户提供使用主头文件的可能性是非常有帮助的。如果我记得清楚的话,GTK就是这样做的。

大多数答案都提到了编译时,而忽略了这样一个事实,即头的预编译具有巨大的编译时优势,并且与主头一起工作会更好呃技术


最好是,如果直接包含头文件而不包含主头文件,则头文件应该可以工作(这使测试更容易)。现代编译器优化了“如果包含多个头文件,则跳过头文件”逻辑。

我还想补充一点,当库提供主标题时,只包含所需的标题是一个相当糟糕的主意。通常情况下,这样的标题并不包含它所需的所有内容,而是取决于主标题之前包含所有所需标题的事实。因此,如果您是库的用户,您通常没有太多选择ce,并应遵循其作者建议的方式


这也是为什么主标题可能被认为是坏的实践-它使得难以检测到上述情况。

< P>我认为C++中的一些问题,也是这个问题,你可以通过记住C++“咒语”< /P>来回答自己。 不要为你不用的东西付钱


尽可能节省用户(即代码/库的使用者)的计算成本(运行时和编译时)。不要污染名称空间,不要向编译器扔太多东西(还有语法高亮等)。我认为这是C++礼貌的方式:)

一个是最佳实践,另一个是懒惰实践:DBesides是一种惰性方法,它可以帮助新用户轻松使用库,而无需知道类/方法/等的位置。然而(imho)巨大的缺点是对编译时间的负面影响OK到目前为止,我看到主包含是一种懒惰的方法,但确实有一些好处,即新用户。这是否意味着另一种方法将是最佳实践并具有性能优势?这难道不是预编译头的目的吗?最佳实践是让代码走出大门,同时让下一个接管代码库的人这样做,而不想追捕你并敲碎你的膝盖。就个人而言,我更喜欢后者(包括您需要的内容),但在这个问题上,您会发现一个相当平衡的基调。对于准确编写和维护源文件的所有依赖项列表所需的时间,5秒是非常乐观的。您通常在编码时包括您需要的内容,而不是1000行长的源文件。在这种情况下,是的,这将花费你5秒钟以上的时间,但你为什么会处于这样的位置?无论你处于什么位置,工作都必须完成。如果需要5秒多次(每次包含一次),则超过5秒。最重要的部分是在维护期间,当您从文件中删除代码时,决定这是否意味着您删除了依赖项并可以删除包含项。这项工作通常是值得做的,但在我看来,假装它根本不是一项工作并不能证明这一点。这对于大多数编译单元所需的头文件也是有用的,因为您可以使用预编译头文件,并且不会因最小的重建机会而损失太多。非常好,这让我对我想要的东西有了一点了解。我最初的问题没有我希望的那么清楚,但你已经一针见血了。如果我理解正确,请仅在库开发中包含您需要的内容。然后可以创建一个主包含文件来使用库。@Zammald。。。如果库的用户没有太多的文件(这可能是一种模式——使用库比编写库更快、更短,对吗?)是的,我同意你的看法。如果用户代码本身很大,覆盖了很多文件,那么我可以看出这会适得其反。有点平衡。你也可以使用预编译头来加快编译速度。@NathanErnst肯定-不过,我写的所有内容仍然适用。谢谢,这是另一个很好的答案。我必须承认我对预编译头知道的不多,特别是