2

我做了几年的程序员。

我总是被告知(并告诉其他人)你应该在你的 .c 文件中只包含你需要的 .h 文件。不多也不少。

但让我问 - 为什么?

使用今天的编译器,我可以包含项目的整个 h 文件,并且不会对编译时间产生巨大影响。

我不是在谈论包括 OS .h 文件,其中包括许多定义、宏和预处理命令。

只包括一个“MyProjectIncludes.h”。那只会说:

#pragma once
#include "module1.h"
#include "module2.h"
// and so on for all of the modules in the project

你说什么?

4

4 回答 4

3

这与 .c 文件的编译时间无关,因为包含太多标题。正如您所说,包含一些额外的标头不太可能对该文件的编译时间产生太大影响。

真正的问题是,一旦您使所有 .c 文件都包含“主”头文件,那么每次更改任何 .h 文件时,都需要重新编译每个 .c 文件,因为您制作了每个 .c 文件。 c 文件依赖于每个 .h 文件。所以即使你做了一些无害的事情,比如添加一个#define只有一个文件会使用的新文件,你也会强制重新编译整个项目。如果你和一个团队一起工作并且每个人都经常更改头文件,情况会变得更糟。

如果重建整个项目的时间很短,比如不到 1 分钟,那么它就没有那么重要了。我承认为了方便起见,我已经按照您在小型项目中的建议进行了操作。但是,一旦您开始处理一个需要几分钟才能重建所有内容的大型项目,您就会体会到需要重建一个文件与重建所有文件之间的区别。

于 2014-11-03T21:28:38.823 回答
1

它会影响您的构建时间。此外,您还冒着循环依赖的风险

于 2014-11-03T21:13:52.370 回答
1

通常,您不希望重新编译模块,除非它们实际依赖的标头已更改。对于较小的项目,这可能无关紧要,全局“include_everything.h”文件可能会使您的项目变得简单。但是在大型项目中,编译时间可能非常重要,最好尽可能减少模块间的依赖关系。最小化包含不必要的标头只是一种方法。使用仅由指针或引用引用的类型的前向声明,使用 Pimpl 模式、接口和工厂等,都是旨在减少模块之间依赖关系的方法。这些步骤不仅可以减少编译时间,还可以使您的系统更容易测试和更容易修改。

John Lakos “Large Scale Software Design”是关于这个主题的一个优秀但有些过时的参考资料。

于 2014-11-03T21:17:05.350 回答
-1

当然,就像您所说的那样,包含额外的文件不会对您的编译时间造成太大影响。就像您的建议一样,将所有内容转储到使用 1 包含行中会更方便。

但是,如果陌生人确切知道.h您在特定.c文件中使用了哪些文件,您不觉得他们可以更好地理解您的代码吗?对于初学者,如果您的代码有任何错误并且这些错误在.h文件中,他们就会确切地知道.h要检查哪些文件。

于 2014-11-03T21:20:35.883 回答