我从 c++ 参考中看到了这一行cstdio
:
库的每个元素都在std namespace
.
但我尝试了代码:
std::printf("hello world");
printf("hello world");
C++ 标头将名称放在 std 和全局命名空间中是真的吗?
包括在命名空间和可能在全局命名空间cstdio
中导入符号名称。
包括在全局命名空间和可能在命名空间中导入符号名称。std
stdio.h
std
这同样适用于所有 c 样式的标题。
参考:
C++11 标准
附件 D(规范性)兼容性特性 [depr]规定:
D.6 C 标准库头文件
1 为了与 C 标准库和 C Unicode TR 兼容,C++ 标准库提供了 25 个 C 标头,如表 151 所示。
其中包括:
<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h>
<complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h>
<ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h>
<errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h>
<fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>
进一步,
2 每个 C 头文件,每个头文件都有一个形式的名称,其
name.h
行为就像每个名称放在标准库名称空间中对应的名称cname header
都放在全局名称空间范围内。未指定这些名称是否首先在命名空间 std 的命名空间范围 (3.3.6) 内声明或定义,然后通过显式使用声明 (7.3.3) 注入全局命名空间范围。3 [ 示例:标头
<cstdlib>
确实在命名空间 std 中提供了它的声明和定义。它还可以在全局命名空间中提供这些名称。头文件<stdlib.h>
在全局命名空间中确实提供了相同的声明和定义,就像在 C 标准中一样。它还可以在命名空间 std 中提供这些名称。—结束示例]
根据 libstdc++ 文档:
该标准规定,如果一个包含 C 样式的标头(
<math.h>
在这种情况下),则这些符号将在全局命名空间中可用,并且可能在命名空间 std:: 中可用(但这不再是严格要求。)另一方面,包括 C++ 风格的标头 (<cmath>
) 保证实体可以在命名空间 std中找到, 也可能在全局命名空间中找到。
http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s02.html