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

Szy*_*una 2 c++ g++ clang

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

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

它在我的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流,这可以解决问题,但我的问题更具理论性,并且用于自动包含的未来目的.

Rob*_*edy 12

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

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