问题描述
在 cppreference.com 上搜索文档时,我发现某些功能在不同的标题中被多次定义...
例如:std::move
(在 <algorithm>
和 <utility>
中)、std::size_t
等(见下文)。
The page about std::size_t
以此精度开始:
Defined in header <cstddef>
Defined in header <cstdio>
Defined in header <cstdlib>
Defined in header <cstring>
Defined in header <ctime>
Defined in header <cuchar> (since C++17)
Defined in header <cwchar>
解决方法
每个标准库头文件都需要自包含。如果我们想使用它,我们就不会被迫包含其他任何东西。由于您引用的列表中的所有标题最终都会在某些情况下使用 size_t
,因此包括它们也必须使 size_t
可用。所以这是标准的强制行为。
请注意,cppreference 中的措辞有点误导。并不是每个标头总是定义类型别名。实际定义很可能位于某些内部实现特定的标头中,所有这些公共标头都包含它本身。
所以本质上的行为是,size_t
只有一个“真实”定义。您可以通过包含上述任何标题来获取它。
至于选择哪一个?您可以检查每个标题的概要。如果您只需要 size_t
,那么 cstddef
是包含它的最小标题。
为什么会这样?
我能想到的两个原因。
-
头文件中的函数声明和其他任何内容都使用
size_t
,因此需要声明它(与任何其他内容相同)。 -
(也许)方便。例如
size_t
在很多情况下使用,因此仅包含size_t
更简单,例如<iostream>
而不是必须也包含<cstddef>
。
应该选择哪个标题而不是其他标题?
似乎其他人拥有 same question。虽然我会说利用 size_t
在多个标题中的优势。如果您只需要 <iostream>
用于程序,则无需为了它而包含 <cstddef>
。
您可以简单地添加#include