CSTDIO stdio.h 命名空间

cstdio stdio.h namespace

本文关键字:命名空间 stdio CSTDIO      更新时间:2023-10-16

我从 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( 内声明或定义,然后通过显式 using-声明 (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