当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C++中C库的范围-<Xh>vs<cX>》经验,为你挑选了2个好方法。

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 
void f() {
  double var = sqrt( 17 );
}

这将编译好.虽然本书说使用标头仅定义std命名空间中的名称,但您可以使用这些名称而不限定命名空间.我在这里错过了什么?

PS使用GNU.GCC编译器



1> Michael Burr..:

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语言太过根深蒂固了 - 并且使用它们从来没有任何现实世界的问题(显然,使用样式标题从来没有任何真正的世界好处).


我是一个奇怪的纯粹主义者,可能会继续使用``标题,但这很难过.

2> user151019..:

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

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

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

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

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

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有