这是我一直想知道但从未确定的事情,这只是纯粹出于好奇,不是真正的问题。
据我所知,当你像#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的内容应与相应的头文件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中(但不指定任何其他作用域)。
namespace std
声明内包含了旧的头文件。 - greyfade