【问题标题】:Do I Need My #include Directives In My Headers?我的标题中是否需要我的#include 指令?
【发布时间】:2015-06-26 14:32:50
【问题描述】:

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

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

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

【问题讨论】:

  • 我们无从得知。这取决于你的标题。包括您需要的,仅此而已。
  • 由于编译时间的原因,我总是尝试在头文件中包含绝对最小值。对于几百行代码的程序,它可能不会节省太多时间,但是我的几个项目是几十万行,包含数千个源文件和数千个标题。

标签: c++ c header include


【解决方案1】:

源文件需要的一些头文件可能只是为了实现细节,所以不,也不需要在头文件中#include它们。

我遵循的规则是:#include 仅在头文件中绝对需要,然后在源文件中,#include 头文件包含的所有文件,加上实现细节所需的额外头文件。

如果有人想知道,我将所有 #include 指令从标头复制到源文件的原因是,如果我以后用前向声明替换标头中的这些指令之一,我的源文件不会完全需要改变。

【讨论】:

  • 我是这么想的,但我想我应该确保以防万一。
【解决方案2】:

我通常会包含给定文件所必需的内容。

如果您的标头使用字符串类型,则添加#include &lt;string&gt;。代码也是如此。一般来说,标头是受保护的,因此它既无害又有趣(无需挖掘标头/代码来确定什么是必要的)。

【讨论】:

    【解决方案3】:

    标头肯定不需要cpp 需要的所有#includes。此外,我认为不应该鼓励这种做法,在某些情况下甚至是不可能的。

    我认为您的标头应该具有标头本身所需的内容,仅此(即标头应尽可能少 #includes),而您的 cpp 拥有所有额外的#includes。另请注意,如果 cpp #includes 标头,则无需从 cpp 中的标头重复 #includes。

    对于你的例子,我会

    #include <string>
    

    在标题中,和

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

    还要注意,前向声明可以进一步减少标题中#includes 的数量。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 问题是源文件中的#include指令是否也需要出现在头文件中,而不是相反。
      • @RedRoboHood,IMO 这个答案完全回答了上述问题。
      • @Petr 然后点赞。我不同意你的观点,但我无法改变你的看法。
      【解决方案5】:

      我始终建议将#includes 用于生产代码。

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

      在“流行”头文件中更是如此(头文件被拉入数千次,使用 grep 或 find)。

      甚至到了使用的程度

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

      • 包含文件的双重“保护”(#ifdef 保护在 where-included 和 in-the-header-file 中)和

      • 重构“非常流行”的包含标头(即使检查未发现内容的“凝聚力差”)。

      原因:

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

      我不止一次测量(使用'-H'和C++ map和wc)字节数(字符)很好地进入了多太字节......进行一次构建。共享网络和共享文件服务器的巨大负载。

      • 在这种环境下,清晨构建可能需要 40 分钟。

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

      【讨论】:

        【解决方案6】:

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

        #include<string>
        

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

        【讨论】:

          猜你喜欢
          • 2016-12-25
          • 2011-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多