gpt4 book ai didi

c++ - 为什么我可以在没有传统 header 的情况下在 MSVS 中使用 size_t 和 std::size_t?

转载 作者:太空狗 更新时间:2023-10-29 21:33:51 27 4
gpt4 key购买 nike

我正在使用 Visual Studio 2017 社区版。它允许我在没有适当包含的情况下同时使用 size_tstd::size_t。它似乎适用于大多数 std 库。我认为这是因为图书馆本身的一部分使用它。例如,我发现导致这种行为的一个例子vector

#include <vector>
#include <iostream>

int main()
{
size_t a = 42;
std::size_t b = 0;
std::cout << a << b;
std::cin.ignore();
}

大概这是因为 size() 函数返回一个 std::size_t。这只是一个 header 依赖项,我可以通过适当的包含来避免它吗?这仍然不能解释为什么我可以使用命名空间范围调用它。

(我没有使用 using namespace std。)

This question 暗示并非标准库中的所有 header 都应具有定义。

最佳答案

严格来说你的代码是非法的。 size_t需要在以下 header 中声明类型:

<cstddef>
<cstdio>
<cstdlib>
<cstring>
<ctime>
<cwchar>

而且该标准还允许标准 header 包含其他标准 header 。所以很可能标题 <vector> MSVC 使用的标准库中包含上述 header 之一。这是允许的,但不是标准强制要求的,因此这将适用于您的设置,但可能无法适用于其他标准库实现,即使是您正在使用的同一标准库实现的 future 版本。

因此,总而言之,尝试为您正在使用的所有定义包含标准要求的所有 header 。

恕我直言,这是一个错误的行为,但这是 C++ 为向后兼容包含系统而付出的必要代价,这在多年前似乎是一个合理的设计。其局限性和缺点如今已众所周知,因此委员会正在研究模块,这是当前包容机制的现代替代方案。


至于为什么可以使用size_t没有std:: :

<cstddef>需要申报std::size_t并且还可以选择声明(或引入声明)size_t在全局范围内。

<stddef.h>C向后兼容 header ,它声明 size_t在全局范围内。

所以要么 <cstddef>声明 size_t在全局范围内,包含在 <vector> 中或 <stddef.h>包含在 <vector> 中- 很可能间接通过 <cstddef> .

https://stackoverflow.com/a/283023/2805305

关于c++ - 为什么我可以在没有传统 header 的情况下在 MSVS 中使用 size_t 和 std::size_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49844975/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com