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 个原因。
函数声明和 headers 中的任何其他内容使用 size_t
因此需要声明它(与任何其他内容相同)。
(也许)方便。 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,它会为您导入所有必需的库,但有时不建议包含所有库,因此您必须包含特定的库.
在 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 个原因。
函数声明和 headers 中的任何其他内容使用
size_t
因此需要声明它(与任何其他内容相同)。(也许)方便。
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