是否未指定标准库头是否包含任意标头?

时间:2015-02-26 16:20:51

标签: c++ header-files language-lawyer unspecified-behavior

Which headers in the C++ standard library are guaranteed to include another header?中有一项声明:

  

C ++标准库头文件可能未包含在内   方式,所以程序员通常不应该依赖一个标题   包括另一个。 [...]

在实践中,情况往往如此。例如,<iostream>可能包含<string>,在其他情况下,您需要明确包含<string>。但是,我似乎无法在N4140中找到这种情况。我查了一下:

  • §2.9[lex.header]
  • §17.6.1.2[headers]
  • §17.6.2.2[using.headers]
  • §17.6.4.4[alt.headers]
  • §17.6.5.2[res.on.headers]

我能找到的最近的是来自[using.headers]:

  

2翻译单元可以包括任何顺序的图书馆标题(条款   2)。每个可以包括不止一次,没有效果不同   被包括一次,除了包括的效果   每次在词汇上依赖<cassert><assert.h>   当前定义 NDEBUG 178

但这似乎适用于C ++程序,而不是标准库:

  

[using.overview] / 1本节介绍C ++程序如何获得访问权限   到C ++标准库的设施。 [...]

和[res.on.headers]一样:

  

1 C ++标头可能包含其他C ++标头。一个C ++标题应该   提供其概要中出现的声明和定义。   在其概要中显示的C ++标头包括其他C ++标头   应提供出现在中的声明和定义   那些其他标题的概要。

我认为关键是第一句话,但它没有明确说明它是未指明的行为。它是否表明这是未指明的行为或是否只是暗示?

1 个答案:

答案 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

(...)