是否在std :: namespace中使用C ++版本的C标准库函数?

时间:2015-06-30 10:39:15

标签: c++ c++11

" C ++ Primer" (第5版)在页面91上声明了包含C++标准库标题的C版本而不是.h版本的优势:这样包含的名称最终在std::命名空间中,不要污染全局命名空间。

我尝试了cstdio,并且惊讶地发现我可以在不指定printf()的情况下使用std::。有趣的是,仅包括iostream或仅包含string也足以访问全局printf()。我错过了什么吗?

我正在使用g++ 4.8.2-Wall -Wextra -Werror -std=c++11进行编译。

1 个答案:

答案 0 :(得分:1)

未指定 <cfoo>是否也将名称放入全局命名空间。所有C库名称都保留在C ++的全局命名空间中。

[extern.names] / 3:

  

使用外部链接声明的标准C库中的每个名称都保留给实现,以用作名称空间std和全局名称空间中具有extern "C"链接的名称。

重述一下:

  • 要使用std中的名称,,您必须包含正确的标题。
  • 不得在上述环境中重新定义C标准库中的任何名称。
  • 没有说明是否声明了C标准库中的任何特定名称(除非您明确包含已弃用的标题<foo.h>)。