2017-08-10 78 views
0

C++标准库提供有关的iostream以下标题:什么时候应该`#include <ios>`,`#包括<iomanip>`等?

<ios> 
<iosfwd> 
<istream> 
<ostream> 
<streambuf> 
<iostream> 
<fstream> 
<sstream> 
<strstream> [deprecated] 
<iomanip> 

是什么时候#include这些标题的最简单,最合理的规则? (如果答案在不同版本的C++中有所不同,我最感兴趣的是C++ 17,而且我最感兴趣的是保证能够工作,而不是哪些头文件在libstdC++中包含其他头文件, 。)

我愿意相信,我可以随时<iostream><fstream>(只有当我用fstreams)度日,和/或<sstream>(仅当我使用stringstreams)。这似乎工作简单的程序,如

#include <iostream> 

int main() { 
    std::cout << std::hex << 42 << std::endl << std::flush; 
} 

但是如果我添加std::setw(42)该程序,然后停止编译;在这种情况下,我还需要包含<iomanip>

这样,规则似乎是“包括<iostream><fstream>,和/或<sstream>;此外包括<iomanip>如果你使用任何these操纵。”

如果我按照这个规则宗教,我将永远运行到哪里需要包括的情况下<ios><iosfwd><istream><ostream>,和/或<streambuf>在我的应用程序代码?

+1

不太确定我明白这个问题。有一个非常清晰的每个头文件提供了什么东西的列表,然后包含一些头文件,为每个使用的头文件提供foo,就像使用任何头文件一样。 IO头没有特殊之处。 –

+0

我也不确定我是否完全遵循。只有在包含时才使用你所需要的。如果需要,您应该包括它,如果它没有被使用,请将其删除。你不能使用Foo,如果你没有#include 对不对? –

+2

当你需要它们时。如果编译器说它缺少IOS中的东西的定义,请包括IOS。 – user4581301

回答

1

如果我按照这个规则宗教,我将永远运行到哪里,我需要包括的情况下<ios><iosfwd><istream>,在我的应用程序代码<ostream>,和/或<streambuf>

好,<iostream>包括<ios><streambuf><istream><ostream>。而<iosfwd>只是前向声明,所以你也不需要那个。所以......我想是的。

<fstream>给你所有的文件相关的东西:filebufifstreamofstreamfstream(和其广泛的同行)。

<sstream>同样给你所有的stringstream类型和stringbuf

所有留给你的是记住<iomanip>中的内容,这并不是那么多,但你总是可以查看它。

+0

''包括''。 –

相关问题