C++ STL 和多重定义

C++ STL and multiple definitions

cppreference.com 上搜索文档时,我发现某些功能在不同的 header 中定义了多次...

例如: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>

为什么会这样?应该选择哪个 header 而不是其他?

Why is this the case?

我能想到的 2 个原因。

  1. 函数声明和 headers 中的任何其他内容使用 size_t 因此需要声明它(与任何其他内容相同)。

  2. (也许)方便。 size_t 例如在很多情况下使用,因此仅包含 size_t 更简单,例如 <iostream> 而不是必须包含 <cstddef>

And which header should one choose rather than any other?

似乎有人拥有 same question。虽然我会说利用 size_t 在多个 headers 中的优势。如果您的程序只需要 <iostream>,则不需要为了它而包含 <cstddef>

每个标准库 header 都需要自包含。如果我们想使用它,我们不会被迫包含任何其他内容。由于您引用的列表中的所有 header 最终都在某种程度上使用了 size_t,因此包括它们也必须使 size_t 可用。所以这是标准的强制行为。

请注意,cppreference 中的措辞有点误导。并不是每个 header 总是定义类型别名。实际定义很可能是在某些特定于内部实现的 header 中,所有这些 public header 本身都包含它。

所以本质上的行为是 size_t 的“真实”定义。您可以通过包含上述任何 headers.

来获得它

至于选择哪一个?您可以检查每个 header 的概要。如果您只需要 size_t,那么 cstddef 是包含它的最小 header。

您可以简单地添加#include,它会为您导入所有必需的库,但有时不建议包含所有库,因此您必须包含特定的库.