C++ 标准库头文件可能以未指定的方式相互包含,因此程序员通常不应该依赖一个头文件来包含另一个头文件。但是,在少数情况下,可以保证一个 header 包含另一个 header ,或者使某些功能可用,否则这些功能需要包含另一个 header 。那些是什么情况?
最佳答案
此答案忽略 C header - <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
, std::empty
和 std::data
名义上居住在<iterator>
, 但如果包含以下任何 header 也可用:<array>
, <deque>
, <forward_list>
, <list>
, <map>
, <regex>
, <set>
, <string>
, <unordered_map>
, <unordered_set>
, 和 <vector>
(§27.7 [iterator.range],§27.8 [iterator.container])。
当<string_view>
包括在内,*begin
和 *end
函数和两个通用 std::swap
[utility.swap] 中定义的重载( swap(T&, T&)
和 swap(T (&a)[N], T (&b)[N])
) 保证可用。 size/empty/data
,然而,不是。 (§24.4.1 [string.view.synop])。
关于c++ - C++ 标准库中的哪些头文件保证包含另一个头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614983/