因此,这是我一直想知道的事情,但从未完全确定。因此,这完全是出于好奇,不是真正的问题。

据我了解,当您执行#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/

10-11 22:08
查看更多