我只能在标准草案N4582中找到以下内容:
[res.on.headers/1] C++头文件可以包含其他C++头文件。
它似乎并没有指定一个C++头文件是否可以包含C标准头文件。
如果允许这样做,那么即使未包含该头文件(因为程序可能通过某些C++标准头文件隐式包含该头文件),使用在C标准头文件中定义的全局名称是否不安全?
我只能在标准草案N4582中找到以下内容:
[res.on.headers/1] C++头文件可以包含其他C++头文件。
它似乎并没有指定一个C++头文件是否可以包含C标准头文件。
如果允许这样做,那么即使未包含该头文件(因为程序可能通过某些C++标准头文件隐式包含该头文件),使用在C标准头文件中定义的全局名称是否不安全?
C++标准的第D.3 C standard library headers节将26个C标准头文件包含在C++中。因此,它们是C++的一部分。此外,许多其他C头文件遵循语言的共享子集(可能通过#ifdef
排除一些内容),使它们成为有效的C和C++头文件。
我的回答来晚了,但是我会补充一些其他人没有提到的内容。
简短回答:标准是否允许标准的C++头文件包含标准的C头文件仍然不清楚。
其他回答正确地观察到:
不清楚的是,标准的C头文件是否是标准的C++头文件。 我可以提供两种证据。
为什么C头文件确实是C++头文件
在GCC 6.24和GNU的标准C库2.24上,以下测试无法编译。
#include <iostream>
namespace {
const int printf {42};
}
int main()
{
std::cout << printf << "\n";
return 0;
}
#include <cstdio>
。<*.h>
C++头文件的C库设施...”的话开始。如果C头文件在撰写这些文字的人看来是C++头文件,那么这似乎是一种奇怪的写法。
结论:模棱两可
不幸的是,像其他回答者一样,我无法在标准中找到明确的答案。与其他回答者不同的是,我认为答案仍然是模棱两可的。标准中相关的部分包括[contents]、[res.on.headers]和[depr.c.headers]。
观点
如果您想知道在我看来哪种选择具有更多的证据,那么我倾向于不同意其他答案。出于所引用的原因,我倾向于说标准不允许标准的C++头文件包含标准的C头文件。这种包含方式与普通的C++使用相矛盾,因为这种包含方式使匿名全局命名空间更难使用。[将我的测试中的printf
更改为foo
,然后问一下,如果未来的标准C库添加了一个函数foo()
会发生什么。这个实验说明了问题。]