《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.
但是,当我以 样式使用 C 标头时,我不需要限定命名空间。例如...
#include <cmath>
void f() {
double var = sqrt( 17 );
}
这会编译得很好。尽管书中说使用 标头仅定义 std 命名空间中的名称,但您可以在不限定命名空间的情况下使用这些名称。我在这里缺少什么?
附:使用 GNU.GCC 编译器
MSVC 团队的成员 Stephan T. Lavavej 在他的一篇博客文章 (http://blogs.msdn.com/vcblog/archive/2008/08/28/the-mallocator.aspx#8904359):
> 另外,<cstddef>
, <cstdlib>
, and std::size_t
等应该使用!
我曾经对此非常小心。 C++98有一个美好的梦想<cfoo
> 将声明命名空间 std 中的所有内容,并且<foo.h>
将包括<cfoo>
然后使用 using 声明将所有内容拖到全局命名空间中。 (这是 D.5 [depr.c.headers]。)
许多实现者都忽略了这一点(其中一些实现者对 C 标准库头文件的控制很少)。因此,C++0x 已被更改以符合实际情况。截至 N2723 工作文件,http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf , now <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 标准库的头文件,这很有趣。)
我 100% 同意 Lavavej 的观点,除了我从未尝试过非常小心地使用<cfoo>
甚至当我第一次开始使用 C++ 时,样式标头 - 标准 C 的标头太根深蒂固了 - 使用它们从来没有任何现实世界的问题(显然,使用它们从来没有任何现实世界的好处)<cfoo>
样式标题)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)