" C ++ Primer" (第5版)在页面91
上声明了包含C++
标准库标题的C
版本而不是.h
版本的优势:这样包含的名称最终在std::
命名空间中,不要污染全局命名空间。
我尝试了cstdio
,并且惊讶地发现我可以在不指定printf()
的情况下使用std::
。有趣的是,仅包括iostream
或仅包含string
也足以访问全局printf()
。我错过了什么吗?
我正在使用g++ 4.8.2
与-Wall -Wextra -Werror -std=c++11
进行编译。
答案 0 :(得分:1)
未指定 <cfoo>
是否也将名称放入全局命名空间。所有C库名称都保留在C ++的全局命名空间中。
[extern.names] / 3:
使用外部链接声明的标准C库中的每个名称都保留给实现,以用作名称空间std和全局名称空间中具有
extern "C"
链接的名称。
重述一下:
std
中的名称,,您必须包含正确的标题。<foo.h>
)。