因此,这是我一直想知道的事情,但从未完全确定。因此,这完全是出于好奇,不是真正的问题。
据我了解,当您执行#include <cstdlib>
之类的操作时,所有内容(当然,宏除外)都在std::
命名空间中声明。我见过的每个实现都通过执行以下操作来做到这一点:
#include <stdlib.h>
namespace std {
using ::abort;
// etc....
}
当然,哪一个对全局 namespace 和
std
中的事物都有影响。这种行为得到保证吗?还是有可能实现将这些内容放在std
中而不放在全局 namespace 中?我能想到的唯一方法是让您的libstdc++实现每个c函数本身,直接将它们放置在std
中,而不是仅包含现有的libc header (因为没有机制可以从 namespace 中删除某些内容)。当然,这是费力的,几乎没有 yield 。我的问题的实质是,以下程序是否严格符合并保证能正常工作?
#include <cstdio>
int main() {
::printf("hello world\n");
}
编辑:我找到的最接近的是这个(17.4.1.2p4):
老实说,我可以用任何一种方式解释。 “每个头cname的内容应与相应头名称的h。的内容相同,如ISO/IEC 9899:1990编程语言C所规定”,告诉我在全局 namespace 中可能需要它们, C++标准库,但是,声明和定义(名称除外)
在C中被定义为宏的宏)在std命名空间的命名空间范围(3.3.5)之内。”说它们在std中(但未指定它们所在的任何其他范围)。
最佳答案
这是来自MSVC团队(http://blogs.msdn.com/vcblog/archive/2008/08/28/the-mallocator.aspx#8904359)的Stephan T. Lavavej的一个很好的情况简介(相对于标准所说)。
我自己从未喜欢过<cfoo>
header ,并发现我一直使用<foo.h>
。现在,我觉得我可以不再对在这方面缺乏C++“纯度”感到焦虑。
关于c++ - 在<c ____> header 中声明的C函数是否保证在全局命名空间以及std中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2587445/