iostream vs ostream有什么不同?

Mus*_*ici 16 c++ gcc

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

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

但在书中的例子中

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

那么iostream,ostream,istream是头文件吗?
如果没有必要使用ostream(iostream会创建作业),为什么作者会在示例中包含它?或者为什么ostream头文件仍然存在

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

Mil*_*kov 16

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

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

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

  • "*请注意,iostream包括istream和ostream*"C++ 03不保证这一点,只有C++ 11; 在C++ 11之前,必须使用`#include <ostream>`才能保证包含`std :: endl`. (9认同)
  • 一个标准的库实现需要明确地包含`<ostream>`来使HelloWorld工作,这与Francium是最不稳定的自然元素(http://en.wikipedia.org/wiki/Francium).它们都具有约22分钟的半衰期.在std :: library实现的情况下,这是指在被放弃之前它将在市场力量中存活的时间量. (6认同)
  • "*2003年的C++标准(仍然是官方标准)*"C++ 11标准是正式的,它不是OP正在阅读的目标. (4认同)
  • *"一些编译器(例如GCC 3.x)在编译C++代码时自动包含iostream"* - 您确定吗?gcc 3.4.6没有这样做,我不希望它来自任何版本的gcc. (2认同)

Set*_*gie 11

在C++ 11中,如第27.4.1节中的标准所规定,标头本身iostream包含istreamostream标头,因此#include <ostream>是多余的.

iostream上述部分标准给出的"概要" 是

#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>

namespace std {
    extern istream cin;
    extern ostream cout;
    extern ostream cerr;
    extern ostream clog;

    extern wistream wcin;
    extern wostream wcout;
    extern wostream wcerr;
    extern wostream wclog;
}
Run Code Online (Sandbox Code Playgroud)

  • C++ 03不保证这一点,只有C++ 11; 在C++ 11之前,必须使用`#include <ostream>`才能保证包含`std :: endl`. (5认同)
  • @mekici§是"section"一词的符号,它意味着我告诉你的信息来自C++ 11标准中的第27.4.1节(如果您不知道,则该文件是定义了关于C++语言的一切) (4认同)

Mic*_*fik 6

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

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


Mus*_*ici 5

所以之后 我向Bjarne Stroustrup发送了电子邮件,他的回答是这样的:就
我个人而言,我一直使用iostream,而您则不需要。存在ostream,以便人们只能#include所需的最低限度的声明。

在此处输入图片说明

  • 我说了_pre-C ++ 11_。即C ++ 03。Bjarne关于C ++ 03是错误的(可悲的是)。 (2认同)