C ++标准库中的哪些头文件保证包含另一个头文件?

时间:2014-10-28 17:43:25

标签: c++ c++11 c++14 header-files c++17

C ++标准库头文件可能以非指定的方式相互包含,因此程序员通常不应该依赖于包含另一个头文件的一个头文件。但是,在少数情况下,保证标头包含另一个标头,或者使某些功能可用,否则需要包含另一个标头。这些案件是什么?

2 个答案:

答案 0 :(得分:36)

此答案会忽略C标头 - <meow.h><cmeow>。在C ++库头文件中(所有引用都是针对N4659):

<initializer_list>保证包括在内:

<iostream>保证包含<ios><streambuf><istream><ostream>(§30.4.1[iostream.syn])。

<ios>保证包含<iosfwd>(§30.5.1[ios.syn])。

<bitset>保证包含<string><iosfwd>(§23.9.1[bitset.syn])。

免费功能模板std::beginstd::end,C ++ 14 c-r-cr-版本以及C ++ 17免费功能模板std::sizestd::emptystd::data名义上位于<iterator>,但如果包含以下任何标头,它们也可用:<array>,{{ 1}},<deque><forward_list><list><map><regex><set><string>,{{1} }和<unordered_map>(§27.7[iterator.range],§27.8[iterator.container])。

包含<unordered_set>时,<vector><string_view>函数以及[utility.swap]*begin中定义的两个通用*end重载std::swap}保证可用。但是,swap(T&, T&)不是。 (§24.4.1[string.view.synop])。

答案 1 :(得分:0)

以下是 C++20 的强制包含,取自 N4860

比较包含在:

  • 数组
  • 计时
  • 协程
  • deque
  • 文件系统
  • forward_list
  • 迭代器
  • 列表
  • 地图
  • 记忆
  • 可选
  • 排队
  • 范围
  • 正则表达式
  • 设置
  • 堆栈
  • 字符串
  • string_view
  • 系统错误
  • 线程
  • 元组
  • 类型索引
  • unordered_map
  • unordered_set
  • 实用程序
  • 变体
  • 向量

initializer_list 包含在:

  • 算法
  • 数组
  • deque
  • forward_list
  • 列表
  • 地图
  • 排队
  • 随机
  • 范围
  • 正则表达式
  • 设置
  • 堆栈
  • 字符串
  • 线程
  • unordered_map
  • unordered_set
  • 实用程序
  • valarray
  • 向量

字符串包含在:

  • 位集

iosfwd 包含在:

  • 位集
  • ios

概念包含在:

  • 迭代器

迭代器包含在:

  • 范围

ios、streambuf、istream 包含在:

  • iostream

ostream 包含在:

  • iostream
  • 同步流

cinttypes 包含在:

  • cstdint