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.
但是,当我在<cX>样式中使用C头时,我不需要限定命名空间.例如...
#include <cmath>
void f() {
double var = sqrt( 17 );
}
Run Code Online (Sandbox Code Playgroud)
这将编译好.虽然本书说使用<cX>标头仅定义std命名空间中的名称,但您可以使用这些名称而不限定命名空间.我在这里错过了什么?
PS使用GNU.GCC编译器
Stephan T. Lavavej是MSVC团队的成员,在他的一篇博文(http://blogs.msdn.com/vcblog/)的评论中解决了这种情况的现实(以及对该标准的一些改进).archive/2008/08/28/the-mallocator.aspx#8904359):
>也,
<cstddef>
,<cstdlib>
,和std::size_t
等应使用!我曾经非常小心.C++ 98有一个美妙的梦想,其中
<cfoo
>将声明命名空间std中的所有内容,<foo.h>
并将包含<cfoo>
然后使用using-declarations将所有内容拖动到全局命名空间中.(这是D.5 [depr.c.headers].)许多实现者忽略了这一点(其中一些实现者对C标准库头文件几乎没有控制权).因此,C++ 0x已经改变以匹配现实.截至N2723工作文件http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf,现在
<cfoo>
保证在命名空间std中声明所有内容,并且可能会也可能不会声明事物在全局命名空间内.<foo.h>
相反:它保证在全局命名空间中声明所有内容,并且可以在命名空间std中声明或不声明内容.实际上并且在C++ 0x中,
<cfoo>
无论如何都不能保护在全局命名空间中声明的所有东西.这就是我不再烦恼的原因<cfoo>
.这是图书馆问题456,http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456.
(C++ 0x仍然弃用
<foo.h>
C标准库中的标题,这很有趣.)
我与Lavavej达成了100%的协议,除非我<cfoo>
第一次开始使用C++时从未尝试过使用样式标题时非常小心- 标准的C语言太过根深蒂固了 - 并且使用它们从来没有任何现实世界的问题(显然,使用<cfoo>
样式标题从来没有任何真正的世界好处).
归档时间: |
|
查看次数: |
1181 次 |
最近记录: |