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

标签 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”函数。我大学的教授使用后者,今天他们说我的程序不起作用。

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

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

最佳答案

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

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

关于c++ - 为什么 clang 会自动添加 "cstdio.h"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19792052/

相关文章:

c++ - 如何在 unordered_map 中设置值并确定是否添加了新键

android - 调试原生 Android 时的 SIG33

c++ - 关于带有复制构造函数的 vs/g++

c++ - 为什么 -Wfatal-errors 会关闭有关错误的注释,以及如何重新打开注释?

linux - 使用 clang++ 时默认启用 libc++/libcxx

c++ - AMD 的 NVML 对应物 (c++)

c++ - 使用另一个项目的 ImageMagick 静态编译会出现链接器错误

c++ - 哪个编译器是对的?需要模板化返回类型之前的 'template'?

c - 在 PIC 微 Controller 项目 : need to disable clang warning 中使用 clang 自动完成

c++ - 是在 Mac 上使用 libc++ 或 libstdc++ 构建的库