C++ 标准库头文件可能以未指定的方式相互包含,因此程序员通常不应该依赖一个头文件包括另一个头文件。但是,在少数情况下,可以保证一个标头包含另一个标头,或者使某些功能可用,否则这些功能需要包含另一个标头。那些案例是什么?
2 回答
这个答案忽略了 C 头文件 -<meow.h>
和<cmeow>
那些。C++ 库头文件(所有引用均指向 N4659):
<initializer_list>
保证包含在:
<utility>
(§23.2.1 [utility.syn])<string>
(§24.3.1 [string.syn])<array>
(§26.3.2 [array.syn])<deque>
(§26.3.3 [deque.syn])<forward_list>
(§26.3.4 [forward_list.syn])<list>
(§26.3.5 [list.syn])<vector>
(§26.3.6 [vector.syn])<map>
(§26.4.2 [associative.map.syn])<set>
(§26.4.3 [associative.set.syn])<unordered_map>
(§26.5.2 [unord.map.syn])<unordered_set>
(§26.5.3 [unord.set.syn])<queue>
(§26.6.2 [queue.syn])<stack>
(§26.6.3 [stack.syn])<algorithm>
(§28.2 [algorithms.syn])<random>
(§29.6.2 [rand.synopsis])<valarray>
(§29.7.1 [valarray.syn])<regex>
(§31.4 [re.syn])
<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::begin
、std::end
、 C++14 c-
、r-
和版本以及cr-
C++17 自由函数模板std::size
,名义上驻留在 中,但如果包含以下任何标头,也可以使用:、、、、、、, , ,和(§27.7 [iterator.range] , §27.8 [iterator.container] )。std::empty
std::data
<iterator>
<array>
<deque>
<forward_list>
<list>
<map>
<regex>
<set>
<string>
<unordered_map>
<unordered_set>
<vector>
当<string_view>
包含时,*begin
and函数和定义在[utility.swap] ( and ) 中*end
的两个泛型std::swap
重载保证可用。,然而,不是。(§24.4.1 [string.view.synop])。swap(T&, T&)
swap(T (&a)[N], T (&b)[N])
size/empty/data
以下是 C++20 的强制性包含,取自N4860。
比较包含在:
- 大批
- 计时码表
- 协程
- 双端队列
- 文件系统
- forward_list
- 迭代器
- 列表
- 地图
- 记忆
- 可选的
- 队列
- 范围
- 正则表达式
- 放
- 堆
- 细绳
- 字符串视图
- 系统错误
- 线
- 元组
- 类型索引
- 无序映射
- 无序集
- 效用
- 变体
- 向量
initializer_list 包含在:
- 算法
- 大批
- 双端队列
- forward_list
- 列表
- 地图
- 队列
- 随机的
- 范围
- 正则表达式
- 放
- 堆
- 细绳
- 线
- 无序映射
- 无序集
- 效用
- valarray
- 向量
字符串包含在:
- 位集
iosfwd 包含在:
- 位集
- IOS
概念包含在:
- 迭代器
迭代器包含在:
- 范围
ios、streambuf、istream 包含在:
- iostream
ostream 包含在:
- iostream
- 同步流
cinttypes 包含在:
- cstdint