iostream vs ostream有什么不同?

时间:2012-02-13 19:46:41

标签: c++ gcc

正如书中所说(探索C ++:程序员的C ++简介); istream标头声明输入运算符(>>),ostream声明输出运算符(<<<)。
我可以完美地运行该代码而无需添加#include ostream;

#include <iostream>
using namespace std;
int main()
{
  cout << "hello world"<< endl;
  return 0;
}

但在本书的例子中,如

#include <iostream>
#include <ostream>    //why?
using namespace std;
int main()
{
  cout << "hello world"<< endl;
  return 0;
}

所以iostream,ostream,istream都是头文件吗? 如果没有必要使用ostream(iostream完成工作)为什么作者将其包括在内?或者为什么 ostream头文件仍然存在

注意:在Bruce Eckel的Vol 1书(2000年出版)中,ostream or istream没有任何内容。只有一个头文件是iostream

5 个答案:

答案 0 :(得分:16)

正如ildjarn在评论中指出的那样,2003年的C ++标准说iostream不一定包括istream和ostream。所以,从理论上讲,这本书是正确的。

但是,大多数主要编译器供应商已将istream和ostream添加到iostream中,因此您的代码适用于您正在使用的编译器。你可能没有其他一些编译器的运气。

如果要编写可在仅遵循2003标准(或更早版本)的旧编译器上编译的可移植代码,则应包括两个标头。 OTOH,如果你是唯一编译代码并控制使用哪些编译器的人,那么只使用iostream是安全的,因为它是向前兼容的。

答案 1 :(得分:11)

在C ++ 11中,正如§27.4.1中的标准所指定的那样,标题iostream本身包含istreamostream标题,因此{{1}是多余的。

上述部分标准中给出的#include <ostream>的“概要”是

iostream

答案 2 :(得分:6)

您需要#include <iostream>才能访问标准流对象,例如cout。该代码的作者确保不依赖于<iostream>包含<ostream>的实现细节(在C ++ 11之前无法保证)。

您需要<ostream>才能访问operator <<std::endl

答案 3 :(得分:5)

那之后;我发了电子邮件给Bjarne Stroustrup,他回答的是:
就个人而言,我总是使用 iostream 而你永远不需要两者。存在 ostream ,以便人们可以#include仅包含所需的最小声明。

enter image description here

答案 4 :(得分:3)

  

我可以完美地运行该代码而无需添加#include ostream;

您碰巧能够进行特定安装。升级您的工具链和that may no longer be the case

从C ++ 11开始,您可以将其视为iostream / ostream,但还有其他类似的场景,C ++ 11没有涵盖。

所以,一般的经验法则是:无论何时使用标准库功能,都包含声明/定义的标题,而不是做出假设和快捷方式。