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

Why does clang automatically add "cstdio.h"?

本文关键字:cstdio 添加 叮当 为什么      更新时间:2023-10-16

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

#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"功能。我大学的教授使用后者,今天他们说我的程序不起作用。

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

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

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

最佳实践要求显式包含所需的标头;不要指望实现隐式包含未提及的标头。它很容易从一个版本更改为另一个版本,并且会影响可移植性。