为什么clang会自动添加“cstdio.h”?

时间:2013-11-05 15:03:58

标签: c++ g++ clang

假设我有这样的代码片段:

#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
printf("%d",5);
}

它在我的Apple LLVM版本5.0(clang-500.2.79)(基于LLVM 3.3svn)编译器上编译并正常运行,但它在gcc版本4.4.5(Debian 4.4.5-8)上失败,说它不识别“printf”功能。我的Uni教授使用后者,今天他们说我的程序不起作用。

我的问题是 - 为什么clang(在OS X 10.9上由g ++ namefile.cpp运行)在这种情况下会自动包含“cstdio.h”?

PS。我知道C ++中有cin和cout流,这可以解决问题,但我的问题更具理论性,并且用于自动包含的未来目的。

1 个答案:

答案 0 :(得分:12)

允许标准C ++标头包含任何其他标准标头。每个实现都可以选择确定哪些标头包含哪些标头。你已经包含了iostream,并且允许包括cstdio,但它也被允许不包含。您的Clang版本和您的教师GCC版本明显地以不同的方式行使了该选项。

最佳做法要求您明确包含所需的标头;不要指望你实现隐式包含你没有提到的标题。它可能会从一个版本更改为另一个版本,并且会影响可移植性。