Which headers in the C++ standard library are guaranteed to include another header?中有一项声明:
C ++标准库头文件可能未包含在内 方式,所以程序员通常不应该依赖一个标题 包括另一个。 [...]
在实践中,情况往往如此。例如,<iostream>
可能包含<string>
,在其他情况下,您需要明确包含<string>
。但是,我似乎无法在N4140中找到这种情况。我查了一下:
我能找到的最近的是来自[using.headers]:
2翻译单元可以包括任何顺序的图书馆标题(条款 2)。每个可以包括不止一次,没有效果不同 被包括一次,除了包括的效果 每次在词汇上依赖
<cassert>
或<assert.h>
当前定义 NDEBUG 。 178
但这似乎适用于C ++程序,而不是标准库:
[using.overview] / 1本节介绍C ++程序如何获得访问权限 到C ++标准库的设施。 [...]
和[res.on.headers]一样:
1 C ++标头可能包含其他C ++标头。一个C ++标题应该 提供其概要中出现的声明和定义。 在其概要中显示的C ++标头包括其他C ++标头 应提供出现在中的声明和定义 那些其他标题的概要。
我认为关键是第一句话,但它没有明确说明它是未指明的行为。它是否表明这是未指明的行为或是否只是暗示?
答案 0 :(得分:4)
鉴于在
下的C ++ 14标准中找到了[res.on.headers]17图书馆介绍
17.6图书馆范围的要求
17.6.5符合实施
17.6.5.2标题
似乎可以肯定地说&#34; C ++标题&#34;在本段中意味着C ++标准库头。该术语应被理解为与C标题(即,从C标准库中提出的那些货物标题库)相对应,这在这方面较不自由。 [res.on.headers]对他们说:
C标准头文件(D.5)应仅包括其对应的C ++标准头文件,如17.6.1.2中所述。
由于C ++标准库标题可能包含其他C ++标准库标题,因此包含其他标准库标题后,任何其他标准库标题的内容都可能已知,但除非声明标题必须包含另一个标题,这是不可靠的。是否一个标题必须包含另一个标题是在逐个标题的基础上定义的。例如,对于<iostream>
,它在[iostream.objects.overview](27.4.1)中说:
标题
<iostream>
简介#include <ios> #include <streambuf> #include <istream> #include <ostream> (...)
在[template.bitset](20.7)
中标题
<bitset>
简介#include <string> #include <iosfwd> // for istream, ostream (...)