为什么我可以在 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_t
和 std::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>
.
我正在使用 Visual Studio 2017 社区版。它允许我在没有适当包含的情况下同时使用 size_t
和 std::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
。)
严格来说你的代码是非法的。 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>
.