我正在使用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()
函数返回std::size_t
。这只是一个标头依赖,我可以通过正确的包含避免它吗?这仍然无法解释为什么我可以用命名空间范围调用它。
(我没有使用using namespace std
。)
This question意味着std库中的所有头文件都不应该有定义。
答案 0 :(得分:2)
严格来说,您的代码是非法的。 size_t
类型需要在以下标题中声明:
<cstddef>
<cstdio>
<cstdlib>
<cstring>
<ctime>
<cwchar>
但该标准也允许标准标题包含其他标准标题。因此,MSVC使用的标准库中的标头<vector>
很可能包含上面的标头之一。这是允许的,但不是标准规定的,因此这将适用于您的设置,但可能无法在其他标准库实现上工作,即使在您正在使用的同一个版本的未来版本上也是如此。
因此,最后尝试包括标准所需的所有标题,用于您正在使用的所有定义。
恕我直言,这是一个错误的行为,但是C ++支付向后兼容包含系统所需的代价,这个包含系统多年前似乎是一个合理的设计。这种局限性和缺点是众所周知的,因此委员会正在研究模块,这是现有包容机制的现代替代方案。
至于为什么你可以在没有size_t
的情况下使用std::
:
<cstddef>
需要声明std::size_t
,并且还可以选择在全局范围内声明(或引入声明)size_t
。
<stddef.h>
是C
向后兼容的标头,它在全局范围内声明size_t
。
因此,<cstddef>
在全局级别声明size_t
并由<vector>
包含<stddef.h>
或<vector>
包含<cstddef>
- 很可能通过{{ 1}}。