标准是否指定哪些标头包含其他标头?

时间:2016-07-17 12:43:36

标签: c++ standards header-files

我正在进行在线编码竞赛,我的想法是找到一个名称比<iostream>短的标题,但包括<iostream>。好吧,直到现在我都没有成功,但这让我想知道:

标准是否指定哪些标头包含其他标头?

例如,在<iostream> cplusplus州:

  

包含此标头可能会自动包含其他标头,例如<ios><streambuf><istream><ostream>和/或<iosfwd>

但是,当我查找<ios>时,没有“<iostream>可能包含此标头”之类的声明。对于某些标题,我可以想象他们需要包含其他人才能正常工作。如果是这种情况,我希望标准能够说明标头如何相互依赖(例如,必须避免循环依赖)。或者标准是否只是确保这些依赖关系不存在并且由实现决定?

4 个答案:

答案 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标题。

相关问题