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

时间:2018-04-15 17:44:43

标签: c++ visual-studio-2017 std size-t

我正在使用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。这只是一个标头依赖,我可以通过正确的包含避免它吗?这仍然无法解释为什么我可以用命名空间范围调用它。

我没有使用using namespace std 。)

This question意味着std库中的所有头文件都不应该有定义。

1 个答案:

答案 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}}。

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