我正在进行在线编码竞赛,我的想法是找到一个名称比<iostream>
短的标题,但包括<iostream>
。好吧,直到现在我都没有成功,但这让我想知道:
标准是否指定哪些标头包含其他标头?
例如,在<iostream>
cplusplus州:
包含此标头可能会自动包含其他标头,例如
<ios>
,<streambuf>
,<istream>
,<ostream>
和/或<iosfwd>
。
但是,当我查找<ios>
时,没有“<iostream>
可能包含此标头”之类的声明。对于某些标题,我可以想象他们需要包含其他人才能正常工作。如果是这种情况,我希望标准能够说明标头如何相互依赖(例如,必须避免循环依赖)。或者标准是否只是确保这些依赖关系不存在并且由实现决定?
答案 0 :(得分:3)
其他标头可能包含哪些标头的一般规则是:有一些标头被指定为自动包含,除此之外,它取决于实现,不需要记录。
17.6.5.1符合实施[符合]
17.6.5.2标题[res.on.headers]
1 C ++标头可能包含其他C ++标头。 C ++标头应提供其概要中出现的声明和定义。在其概要中显示的包含其他C ++标头的C ++标头应提供出现在其他标头的概要中的声明和定义。
关于&#34;的规则在其概要中显示为包括其他C ++标题&#34;适用于:
case
,<utility>
,<string>
,<array>
,<deque>
,<forward_list>
,<list>
,<vector>
,<map>
,<set>
,<unordered_map>
,<unordered_set>
,<queue>
,<stack>
,<algorithm>
,<random>
,{ {1}}包括<valarray>
。<regex>
包括<initializer_list>
,<bitset>
。<string>
包括<iosfwd>
,<iostream>
,<ios>
,<streambuf>
。<istream>
包括<ostream>
。但是,尽管例如<ios>
显示为包括<iosfwd>
,实现可能能够实现要求而不实际包含它,并且根据[res.on.headers],这很好。在大多数情况下,只要声明的函数和类型可以访问,实现是否包含其他标题也没有任何区别。
答案 1 :(得分:2)
就我所知,标准没有指定哪些标题包含其他标题 - 这些实现已定义,而不是您应该依赖的标题。包括你使用的内容。
此外,您可能希望http://cppreference.com/优先于http://cplusplus.com/,因为它(IMHO)的质量要高得多。
答案 2 :(得分:1)
通常,不,标准没有指定标头必须包含其他标头;这取决于在需要时管理从其他标题中获取名称的实现,并允许标准标题包含任何其他标准标题。
一个例外是标题<initializer_list>
;使用初始化程序列表(例如容器)的标头需要包含该标头。
答案 3 :(得分:1)
这取决于标准版的指的是哪个版本。 C ++ 98和C ++ 03对包括其他头文件的头文件没有要求。
从C ++ 11或C ++ 14开始,标准 要求某些标题包含其他标题。
该标准的所有版本都要求多次包含相同的标题是安全的。
所以,如果你知道你需要一个特定的标题,并且你正在使用一个实现旧标准的编译器,那么只需#include标题。