【问题标题】:Why would I include iostream and ostream separately? [duplicate]为什么要分别包含 iostream 和 ostream? [复制]
【发布时间】:2011-02-08 06:21:24
【问题描述】:

我注意到很多人在 C++ 程序中分别包含 iostream 和 ostream,如下所示:

#include <iostream>
#include <ostream>
int main()
{
}

为什么会有人这样做?由于 iostream 继承自 ostream,它应该包含所有内容,对吗?有什么不为人知的原因吗?简单的 (std::cout) 代码呢?

【问题讨论】:

  • 注意:“重复”在时间上比这个问题晚,但是它有更全面的答案,所以我把链接放在那个地方。

标签: c++ iostream


【解决方案1】:

虽然stringstream 继承自iostream,但它并未在&lt;iostream&gt; 标头中声明。 &lt;iostream&gt; 标头包含 iostream 类型的定义以及著名的 coutcerrcinclog 类型,但不包含 iostreams 的其他类型(例如,文件流)。对于这些,您确实需要明确地#include 必需的头文件。

编辑:针对您修改后的问题,我提出了 C++ 规范,有趣的是它确实没有&lt;iostream&gt; 必须包含 &lt;ostream&gt;&lt;istream&gt;。事实上,只要包含&lt;iosfwd&gt; 就可以了。因此,#include &lt;iostream&gt; 可能不会真正获得istreamostream 的完整类定义。只有明确包含这些标头才能保证这些类的定义可见,而不仅仅是前向声明。

【讨论】:

  • 对不起,我的意思是 ostream,这是我在实际问题和文本中使用的。我已经修改了代码。
  • 致那些投反对票的人:你能解释一下这个答案有什么问题吗?
  • 值得一提的是,使用不完整类型对象的值是非法的,因此不包含&lt;ostream&gt;&lt;iostream&gt; 声明了一个绝对无用的std::cout。我怀疑许多图书馆的实施者曾经试图对他们的客户这样做。
【解决方案2】:

iostream 明确包含istreamostream(C++0x 需要这个,gnu libstdc++ 版本有这个),所以 ostream 在技术上是不必要的

供将来参考:

fstream 包含 fstream(文件流)的声明,

sstream 包含 stringstream(字符串流)的声明

iostream 声明标准 i/o 设施(例如 cin、cout、...)

iosfwd 是前向声明主要类型的标准标头。

【讨论】:

  • @Foo Bah- 你能确认 包含这两个标题吗?在这一点上,规范似乎是沉默的。
  • @templatetypedef gnu 在此声明:gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt11ch24.html
  • @Foo Bah- 这对于 GNU 实现来说是正确的,但可以保证是这样吗?也就是说,有人可以制作一个不这样做的符合标准的编译器吗?
  • @templatetypedef iostream 声明cout,而coutostream 类型的对象,在ostream header 中声明
  • @templatetypedef 实际上必须挖掘出来:/ 是的,根据 C++98,从技术上讲,您可以在没有 istream 的情况下定义 iostream,但这将涉及 &lt;iostream&gt;,包括 &lt;iosfwd&gt;。 C++0x 明确要求&lt;iostream&gt; 包含&lt;istream&gt;&lt;ostream&gt;。从技术上讲,符合新旧标准的最佳方法是让 iostream 包含 istream 和 ostream
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
相关资源
最近更新 更多