C++中C库的范围 - <Xh> vs <cX>

Ano*_*ous 5 c++ gcc gnu

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编译器

Mic*_*urr 9

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>样式标题从来没有任何真正的世界好处).

  • 我是一个奇怪的纯粹主义者,可能会继续使用`<cfoo>`标题,但这很难过. (8认同)

use*_*019 6

C库的规则与命名空间的C++库不同

gcc将Gcc文档中的标准解释为

该标准指定如果一个包含C样式头(在本例中为<math.h>),则符号将在全局命名空间中可用,并且可能在命名空间std ::中(但这不再是一个公司要求.)另一方面,包括C++样式的头文件(<cmath>)保证实体将在命名空间std中找到,也可能在全局命名空间中找到.

在草案C0X ++规范中,它在17.6.2.3节中说明

未指定是否首先在全局命名空间范围内声明这些名称,然后通过显式using-declarations将这些名称注入到命名空间std中