我的 Headers 中需要我的 #include 指令吗?

Do I Need My #include Directives In My Headers?

我是否需要在 header 中包含源文件中包含的所有内容?例如,我有一个名为 source.cpp 的文件,其开头为:

#include <string>
#include <vector>
#include <cctype>

然后我有一个名为 source.hpp 的 header,它只包含字符串。这编译得很好,但这是不好的做法,还是会导致将来出现并发症?

无需包含头文件中的所有内容。把需要的东西 在您的头文件中,只需将头文件包含在 .cpp 文件中。 更好的方法是在头文件中使用前向声明。这样你就可以避免不必要的编译。

header 绝对不需要 cpp 需要的所有 #include。而且,我认为这种做法应该被劝阻,在某些情况下甚至是不可能的。

我认为你的 header 应该有 header 本身需要的东西,而 只有 (即 header 应该有尽可能少 #includes),而你 cpp 拥有所有额外的 #includes。另请注意,如果 cpp #includes 为 header.

,则无需在 cpp 中重复 header 中的 #includes

对于你的例子,我会

#include <string>

在 header 和

#include "source.hpp"  // automatically includes string
#include <vector>
#include <cctype>

另请注意,前向声明可以进一步减少 header 中 #include 的数量。

源文件需要的一些 header 可能只是用于实现细节,所以不,没有必要 #include 它们也放在 header 中。

我遵循的规则是:#include只有你绝对需要的在header文件中,然后在源文件中,#include所有文件header 文件包括,以及实施细节所需的额外 headers。

如果有人想知道,我将所有 #include 指令从 header 复制到源文件中的原因是,以防万一我稍后替换 header 中的其中一个指令] 有了前向声明,我的源文件根本不需要改变。

我通常包括给定文件绝对必要的内容。

如果你的header使用字符串类型,那么添加一个#include <string>。代码也一样。通常 header 受到保护,因此它既无害又有趣地表达(无需挖掘 headers/code 来确定什么是必要的)。

我总是建议将生产代码的#include 最小化。

尤其是在 header (.hh) 文件中。

在 'popular' header 文件中更是如此(header 文件被拉入数千次,使用 grep 或 find)。

甚至到了使用的程度

  • 类、结构等的外部/前向声明,而不是包含(通过在 header 文件内使用引用或指针)和

  • 对包含文件加倍 'guards'(where-included 和 in-the-header-file 中的#ifdef 守卫)和

  • 重构 "very popular" 包含 header(即使检查未识别出 'poor cohesion' 的内容)。

原因:

我曾处理过大型构建(即 100 到 1000 个 KLOC)。 态度差w.r.t。 header-file-includes 对构建网络和服务器有显着的加载效果,从而影响所有团队的生产力。

我不止一次测量(使用“-H”和 C++ 映射和 wc)字节计数(字符)很好地进入 mulitple-terrabytes ... 来进行一次构建。共享网络和共享文件服务器上的巨大负载。

  • 在那个环境中,清晨构建可能需要 40 分钟。

  • 在繁忙的工作日中午左右,200 多名开发人员通常会吃很长时间的午餐,因为构建需要 3 到 4 个小时。

是的,当然可以提高编程技能, 我们可以使用 #include"string" ,

#include<string>

这样你就可以避免那些不会被使用的数据。仅从头文件中插入较少的数据,而不是所有内容。