我在cstdio
的c ++参考中看到了这一行:
图书馆的每个元素都在std namespace
。中定义
但我尝试了代码:
std::printf("hello world");
printf("hello world");
C ++标头是否将名称放在std和全局命名空间中 ?
答案 0 :(得分:45)
包括cstdio
在std
命名空间中导入符号名称,在全局命名空间中导入可能。
包括stdio.h
在全局命名空间中导入符号名称,在std
命名空间中导入可能。
这同样适用于所有c-style标题。
<强>参考:强>
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中提供这些名称。 - 例子]
答案 1 :(得分:9)
根据libstdc ++ docs:
标准指定如果包含C样式标题 (在这种情况下为
<math.h>
),符号将在全局中提供 命名空间,也许在命名空间std ::(但这不再是一个公司 要求。)另一方面,包括C ++风格的标题 (<cmath>
)保证在命名空间std 中找到实体 也许在全局命名空间中。
http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s02.html