【发布时间】:2011-02-04 22:59:37
【问题描述】:
所以这是我一直想知道但一直不太确定的事情。所以这完全是出于好奇,而不是真正的问题。
据我了解,当您执行 #include <cstdlib> 之类的操作时,所有内容(当然宏除外)都在 std:: 命名空间中声明。我见过的每个实现都是通过执行以下操作来实现的:
#include <stdlib.h>
namespace std {
using ::abort;
// etc....
}
这当然具有全局命名空间和std 中的效果。这种行为是否得到保证?还是有可能实现可以将这些东西放在std 中,但不能放在全局命名空间中?我能想到的唯一方法是让你的 libstdc++ 实现每个 c 函数本身,将它们直接放在 std 中,而不是仅仅包括现有的 libc 标头(因为没有从命名空间中删除某些内容的机制)。这当然是付出了很多努力,却几乎没有任何好处。
我的问题的本质是,以下程序是否严格符合并保证工作?
#include <cstdio>
int main() {
::printf("hello world\n");
}
编辑:我找到的最接近的是这个(17.4.1.2p4):
除非第 18 条至第 27、每个头cname的内容 应与 对应的头文件名.h,如 在 ISO/IEC 9899:1990 中规定 编程语言 C(第 7 条),或 ISO/IEC:1990 编程语言—C 修正案 1:C 完整性,(第 7 条), 视情况而定,就好像通过包含一样。在 然而,C++ 标准库, 声明和定义 (定义为的名称除外 C) 中的宏在命名空间内 命名空间标准的范围(3.3.5)。
说实话,我可以用任何一种方式解释。 “每个标头 cname 的内容应与相应标头 name.h 的内容相同,如 ISO/IEC 9899:1990 Programming Languages C 中所述”告诉我它们可能在全局命名空间中是必需的,但是“在但是,C++ 标准库的声明和定义(名称除外) 在 C 中定义为宏)在命名空间 std 的命名空间范围(3.3.5)内。”表示它们在 std 中(但没有指定它们所在的任何其他范围)。
【问题讨论】:
-
GCC 附带的 GNU 标头
#include旧标头 withinnamespace std声明,据我所知。 -
至少某些版本的 STLPort4 确实只将函数带入 std 而不是全局命名空间。
-
另请参阅 Red Hat 博客中 Jonathan Wakely 的 Why < cstdlib > is more complicated than you might think。 Wakely 是 GCC 的 C++ 标准库维护者之一。我认为
<math.h>vs<cmath>是一个更有趣的案例研究。
标签: c++ c namespaces