正如书中所说(探索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是安全的,因为它是向前兼容的.
Set*_*gie 11
在C++ 11中,如第27.4.1节中的标准所规定,标头本身iostream包含istream和ostream标头,因此#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)
您需要#include <iostream>访问标准流对象,例如cout.该代码的作者确保不依赖于<iostream>包含的实现细节<ostream>(在C++ 11之前无法保证).
您需要<ostream>访问operator <<和std::endl.
所以之后 我向Bjarne Stroustrup发送了电子邮件,他的回答是这样的:就
我个人而言,我一直使用iostream,而您则不需要。存在ostream,以便人们只能#include所需的最低限度的声明。
