这是我的代码:
#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
命名空间。为什么编译器不会抱怨呢?
答案 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>
由于未指定这些间接包含,因此实现之间的结果会有所不同。因此,程序应始终包含所需的所有头,以便可移植到不同的编译器。