C++编程语言:特别版在第431页说明......
For every header < X.h > defining part of the C standard library in the global namespace and also in namespace std, there is a header < cX > defining the same names in the std namespace only.
但是,当我在
#includevoid f() { double var = sqrt( 17 ); }
这将编译好.虽然本书说使用
PS使用GNU.GCC编译器
Stephan T. Lavavej是MSVC团队的成员,在他的一篇博文(http://blogs.msdn.com/vcblog/)的评论中解决了这种情况的现实(以及对该标准的一些改进).archive/2008/08/28/the-mallocator.aspx#8904359):
>也,
,
,和
std::size_t
等应使用!我曾经非常小心.C++ 98有一个美妙的梦想,其中
>将声明命名空间std中的所有内容, 并将包含
然后使用using-declarations将所有内容拖动到全局命名空间中.(这是D.5 [depr.c.headers].)
许多实现者忽略了这一点(其中一些实现者对C标准库头文件几乎没有控制权).因此,C++ 0x已经改变以匹配现实.截至N2723工作文件http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf,现在
保证在命名空间std中声明所有内容,并且可能会也可能不会声明事物在全局命名空间内.
相反:它保证在全局命名空间中声明所有内容,并且可以在命名空间std中声明或不声明内容.
实际上并且在C++ 0x中,
无论如何都不能保护在全局命名空间中声明的所有东西.这就是我不再烦恼的原因
.
这是图书馆问题456,http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456.
(C++ 0x仍然弃用
C标准库中的标题,这很有趣.)
我与Lavavej达成了100%的协议,除非我
第一次开始使用C++时从未尝试过使用样式标题时非常小心- 标准的C语言太过根深蒂固了 - 并且使用它们从来没有任何现实世界的问题(显然,使用
样式标题从来没有任何真正的世界好处).
C库的规则与命名空间的C++库不同
gcc将Gcc文档中的标准解释为
该标准指定如果一个包含C样式头(在本例中为
),则符号将在全局命名空间中可用,并且可能在命名空间std ::中(但这不再是一个公司要求.)另一方面,包括C++样式的头文件( )保证实体将在命名空间std中找到,也可能在全局命名空间中找到.
在草案C0X ++规范中,它在17.6.2.3节中说明
未指定是否首先在全局命名空间范围内声明这些名称,然后通过显式using-declarations将这些名称注入到命名空间std中