46

我从 c++ 参考中看到了这一行cstdio

库的每个元素都在std namespace. 但我尝试了代码:

std::printf("hello world"); 

printf("hello world");

C++ 标头将名称放在 std 和全局命名空间中是真的吗?

4

2 回答 2

57

包括在命名空间和可能在全局命名空间cstdio中导入符号名称。 包括在全局命名空间和可能在命名空间中导入符号名称。std
stdio.hstd

这同样适用于所有 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 中提供这些名称。—结束示例]

于 2012-05-05T08:50:12.033 回答
11

根据 libstdc++ 文档:

该标准规定,如果一个包含 C 样式的标头(<math.h>在这种情况下),则这些符号将在全局命名空间中可用,并且可能在命名空间 std:: 中可用(但这不再是严格要求。)另一方面,包括 C++ 风格的标头 ( <cmath>) 保证实体可以在命名空间 std中找到, 也可能在全局命名空间中找到。

http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s02.html

于 2012-05-05T08:51:50.530 回答