【问题标题】:How do I avoid re-including <iostream> in multiple files?如何避免在多个文件中重新包含 <iostream>?
【发布时间】:2014-01-25 15:32:08
【问题描述】:

如果我有多个#include 彼此的文件,以及所有#include &lt;iostream&gt;,这是否被认为是不好的,如果是,我将如何避免它?

【问题讨论】:

  • 这样做通常没有问题。为什么要避免它?
  • 通常头文件由预处理器保护
  • 没关系,虽然大规模这样做会导致循环依赖...(这可以通过将有问题的#include 放入 cpp 文件中来“修复”。
  • @Idov - 如果您使用预处理器防护,则不应该
  • @EdHeal:如果 file1.h 需要知道 file2.h 中的类并且 file2.h 需要知道 file1.h 中的类,我认为它们不会有帮助

标签: c++


【解决方案1】:

不,这没有什么问题。每个需要直接使用来自&lt;iostream&gt; 的功能的文件都应该直接包含它。标头守卫将处理多个包含。

当你有循环依赖时,会有一个潜在的问题。比如看这个问题:Resolve header include circular dependencies

但是,由于&lt;iostream&gt; 不太可能包含或依赖于您的任何文件,因此在这种情况下循环依赖不是问题。

【讨论】:

  • 所以不会多次添加的内容?如果我自己编写的文件被多次包含,它们是否必须受到保护?
  • 这通常是个好主意,但解决了一个不同的问题,即 your 符号没有被多次定义。即使您没有在 your 标头中使用保护,&lt;iostream&gt; 本身也会受到保护,因此对于 &lt;iostream&gt;(通常是库中的任何其他标头)来说这不是问题。
  • 我明白了,所以库文件是自动保护的?谢谢。
  • 不是自动的,但通常库会为您执行此操作,因此您不必关心 它们的 文件的多个包含;只为你自己。我从来没有见过不使用标头保护的库,除了打算多次包含用于预处理器黑客攻击的文件。
  • 在任何人误解之前:上面的讨论是关于 iostream 作为头文件以及它应该如何具有头保护以防止代码中的冗余包含。但是,您不会希望在您的 OWN 标头中包含 iostream!仅在您的标题中包含您的标题本身所依赖的内容。 iostream 通常只应包含在您的实现文件 (.cpp/.cxx) 中。如果您的标头取决于 iostream 中的类型,请在您的标头中包含 iosfwd(较小)。欲了解更多信息,请参阅:stackoverflow.com/questions/4300696/what-is-the-iosfwd-header
【解决方案2】:

第一个问题是您是否真的需要包含iostream。在大多数情况下,标题并不真正需要iostream,但较小的ostream(不需要cincout...只需类型std::ostream&amp; 用于operator&lt;&lt;)。即使在那里,正确的标题应该是iosfwd,它只包含这些元素的前向声明。

当然,除非您需要类型的完整声明或真正的 iostream...,否则只需包含它们即可。

【讨论】:

    【解决方案3】:

    不,这不是问题。至少我从来没有听说过。

    预处理器应该完成所需的工作,我认为让每个需要&lt;iostream&gt; 的类/源文件包含它也是一种不错的方式。

    因此大家都知道这个文件使用了iostream提供的功能。

    顺便说一句:using namespace std; 在任何情况下都应该避免,以确保每个人都能看到相应的使用的命名空间。

    【讨论】:

      【解决方案4】:

      这样做没问题,有include guard,确保只包含一次标准头文件

      【讨论】:

        【解决方案5】:

        只要确保没有太多的标题相互堆叠,这不是问题。太多且某些操作系统无法处理它,即较旧的操作系统。但除非你有一台装有非常旧软件的古老计算机,否则它应该完全没问题!祝你好运!

        【讨论】:

          猜你喜欢
          • 2018-09-21
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          • 2020-10-09
          • 1970-01-01
          • 2023-03-09
          相关资源
          最近更新 更多