正如书中所说(探索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
。
答案 0 :(得分:16)
正如ildjarn在评论中指出的那样,2003年的C ++标准说iostream不一定包括istream和ostream。所以,从理论上讲,这本书是正确的。
但是,大多数主要编译器供应商已将istream和ostream添加到iostream中,因此您的代码适用于您正在使用的编译器。你可能没有其他一些编译器的运气。
如果要编写可在仅遵循2003标准(或更早版本)的旧编译器上编译的可移植代码,则应包括两个标头。 OTOH,如果你是唯一编译代码并控制使用哪些编译器的人,那么只使用iostream是安全的,因为它是向前兼容的。
答案 1 :(得分:11)
在C ++ 11中,正如§27.4.1中的标准所指定的那样,标题iostream
本身包含istream
和ostream
标题,因此{{1}是多余的。
上述部分标准中给出的#include <ostream>
的“概要”是
iostream
答案 2 :(得分:6)
您需要#include <iostream>
才能访问标准流对象,例如cout
。该代码的作者确保不依赖于<iostream>
包含<ostream>
的实现细节(在C ++ 11之前无法保证)。
您需要<ostream>
才能访问operator <<
和std::endl
。
答案 3 :(得分:5)
那之后;我发了电子邮件给Bjarne Stroustrup,他回答的是:
就个人而言,我总是使用 iostream 而你永远不需要两者。存在 ostream ,以便人们可以#include仅包含所需的最小声明。
答案 4 :(得分:3)
我可以完美地运行该代码而无需添加#include ostream;
您碰巧能够进行特定安装。升级您的工具链和that may no longer be the case。
从C ++ 11开始,您可以将其视为iostream
/ ostream
,但还有其他类似的场景,C ++ 11没有涵盖。
所以,一般的经验法则是:无论何时使用标准库功能,都包含声明/定义的标题,而不是做出假设和快捷方式。