为什么我要单独包含iostream和ostream?

jac*_*ckj 6 c++ iostream

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

#include <iostream>
#include <ostream>
int main()
{
}
Run Code Online (Sandbox Code Playgroud)

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

tem*_*def 7

虽然stringstream继承自iostream,但它未在<iostream>标头中声明.该<iostream>标头包含的定义iostream类型与著名沿cout,cerr,cin,和clog类型,但不能的其它类型的iostreams(例如,文件流).对于这些,您需要显式#include必需的头文件.

编辑:为了回应你修改过的问题,我提出了C++规范,有趣的是它并没有<iostream>必须包括<ostream>或者<istream>.事实上,它只能包括在内<iosfwd>.因此,有可能#include <iostream>没有实际获得任何一个istream或完整的类定义ostream.只有明确包含这些头文件才能保证这些类的定义,而不仅仅是前向声明,是可见的.


Foo*_*Bah 5

iostream显式包含istreamostream(C++0x 需要这样做,而 gnu libstdc++ 版本会这样做),所以 ostream 在技术上是不必要的

备查:

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

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

iostream 声明标准的 I/O 设施(例如 cin、cout、...)

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

  • @Foo Bah- 这对于 GNU 实现来说是正确的,但它保证是这样吗?也就是说,有人可以制作一个不这样做的符合标准的编译器吗? (2认同)
  • @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 (2认同)