微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ STL 和多重定义

如何解决C++ STL 和多重定义

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 是包含它的最小标题。

,

为什么会这样?

我能想到的两个原因。

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

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

应该选择哪个标题而不是其他标题?

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

,

您可以简单地添加#include,它将为您导入所有必要的库,但有时不建议包含所有库,然后您必须包含特定库。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。