为什么叮当会自动添加"cstdio.h"?
Why does clang automatically add "cstdio.h"?
假设我有这样的代码片段:
#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 显然以不同的方式行使了这一选择。
最佳实践要求显式包含所需的标头;不要指望实现隐式包含未提及的标头。它很容易从一个版本更改为另一个版本,并且会影响可移植性。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 将QIcon添加到QTableView单元格
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 将图像添加到资源文件夹UWP C++
- 为什么叮当会自动添加"cstdio.h"?