为什么我可以在 MSVS 中使用 size_t 和 std::size_t 而不用传统的 headers?

Why can I use size_t and std::size_t in MSVS without the traditional headers?

我正在使用 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() 函数 returns 一个 std::size_t。这只是一个 header 依赖项,我可以通过适当的包含来避免它吗?这仍然不能解释为什么我可以使用命名空间范围调用它。

(我没有使用 using namespace std。)

意味着并非标准库中的所有 header 都应具有定义。

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

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

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

因此,总而言之,尝试为您正在使用的所有定义包含标准要求的所有 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://whosebug.com/a/283023/2805305