我注意到许多人分别在C ++程序中包含iostream和ostream,如下所示:
#include <iostream>
#include <ostream>
int main()
{
}
为什么有人这样做?由于iostream继承自ostream,它应该包含其中的所有内容,对吧?有一些不明原因吗?简单的(std :: cout)代码怎么样?
答案 0 :(得分:7)
虽然stringstream
继承自iostream
,但它未在<iostream>
标头中声明。 <iostream>
标头包含iostream
类型的定义以及着名的cout
,cerr
,cin
和clog
类型,但不包括其他类型为iostreams
(例如,文件流)。对于这些,您需要显式#include
必需的头文件。
编辑:在回答您修改后的问题时,我提出了C ++规范,有趣的是不表示<iostream>
必须包含<ostream>
1}}或<istream>
。实际上,只需要包含<iosfwd>
就可以逃脱。因此,#include <iostream>
可能无法实际获得istream
或ostream
的完整类定义。只有明确包含这些标题才能保证这些类的定义,而不仅仅是前向声明。
答案 1 :(得分:4)
iostream
显式包含istream
和ostream
(C ++ 0x需要这个,gnu libstdc ++版本可以这样做),所以ostream在技术上是不必要的
供将来参考:
fstream
包含fstream(文件流)的声明,
sstream
包含stringstream(字符串流)
iostream
声明标准的i / o设施(例如cin,cout,......)
iosfwd
是前向声明主要类型的标准标题。