Eva*_*ran 16 c c++ namespaces
所以这是我一直想知道但却从未确定过的事情.所以这完全是好奇心问题,而不是真正的问题.
据我所知,当你#include <cstdlib>在std::命名空间中声明所有事情(当然除了宏)之外.我见过的每个实现都是通过执行以下操作来实现的:
#include <stdlib.h>
namespace std {
using ::abort;
// etc....
}
Run Code Online (Sandbox Code Playgroud)
这当然会影响全局命名空间和std.这种行为有保证吗?或者实现是否可能将这些内容放入std全局命名空间中而不是放在全局命名空间中?我能想到的唯一办法做到这一点是有你的libstdc ++实现每一个C函数本身将它们放置在std直接而不只是包括现有的libc头文件(因为没有机制来移除命名空间的东西).这当然是很多努力,几乎没有任何好处.
我的问题的实质是,以下程序是否严格符合并保证有效?
#include <cstdio>
int main() {
::printf("hello world\n");
}
Run Code Online (Sandbox Code Playgroud)
编辑:我发现的最接近的是这个(17.4.1.2p4):
除了如条款18至27所指出的,每一个报头的CNAME的内容应是相同于相应的头name.h的,如在ISO指定/ IEC 9899:1990编程语言C(第7章),或ISO/IEC :1990编程语言-C修正案1:C完整性,(第7条),酌情包括在内.但是,在C++标准库中,声明和定义(在C中定义为宏的名称除外)都在命名空间std的命名空间范围(3.3.5)内.
说实话,我可以解释任何一种方式."每头CNAME的内容应当相同相应的头name.h的,符合ISO/IEC 9899:1990编程语言C"告诉我,他们可以在全局命名空间是必需的,但"在但是,C++标准库,声明和定义(在C中定义为宏的名称除外)都在命名空间std的命名空间范围(3.3.5)内.说他们在std(但没有指明他们所在的任何其他范围).
以下是来自MSVC团队的Stephan T. Lavavej的一个很好的情况概要(有一些相关性与标准所说的相比)(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仍然弃用C标准库中的标题,这很有趣.)
我自己从来都不喜欢<cfoo>标题,发现我一直都在使用<foo.h>.现在我觉得我可以不再担心我在这方面缺乏C++的"纯度".