如何在不使用std的情况下使用int32_t?

时间:2018-05-24 09:02:48

标签: c++ c++11 types header namespaces

这是我的代码:

#include <iostream>

int main()
{
    int32_t i = 5;
    std::cout << "i: " << i << '\n';
}

这是输出:

$ clang++ -std=c++11 -pedantic -Wall -Wextra foo.cpp && ./a.out 
i: 5

这是我的问题:

C ++标准似乎在int32_t命名空间的cstdint中定义std

在我的代码中,我既没有包含cstdint,也没有使用std命名空间。为什么编译器不会抱怨呢?

1 个答案:

答案 0 :(得分:5)

名称int32_t也出现在C库标题stdint.h的全局范围内。这可能会使它在C ++中全局可见。

[Headers]部分说:

  

...每个标题 cname 的内容与C标准库中指定的相应标题 name.h 的内容相同。   但是,在C ++标准库中,声明(除了在C中定义为宏的名称除外)都在命名空间std的命名空间范围内。   未指定这些名称(包括[language.support]中通过[thread]和[depr])添加的任何重载是否首先在全局命名空间范围内声明,然后注入命名空间std通过显式使用声明

标准也有a blanket statement

  

C ++标头可能包含其他C ++标头。

因此,通过包含<iostream>保证来查看流对象,但也可能会访问其他一些库功能。< / p>

由于未指定这些间接包含,因此实现之间的结果会有所不同。因此,程序应始终包含所需的所有头,以便可移植到不同的编译器。