【问题标题】:Why does clang automatically add "cstdio.h"?为什么clang会自动添加“cstdio.h”?
【发布时间】:2013-11-05 15:03:58
【问题描述】:

假设我有这样的代码 sn-p:

#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”?

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

【问题讨论】:

  • 为什么不呢?这不是被禁止的。由于您依赖非标准的“功能”,因此您的程序格式不正确。每次使用某些东西时都应该使用正确的标头,而不是依赖某些编译器为您包含它。
  • 是的,ill-formed 是关键字。
  • 谢谢。 “格式错误”的程序只是一个例子。如果忘记包含 文件并且它仍然可以正常工作而没有给我一个通知/警告,你有什么建议吗?
  • 是的,Szymon:在与您评分相同的环境中进行测试。
  • 这是&lt;cstdio&gt;&lt;stdio.h&gt;,而不是"cstdio.h"

标签: c++ g++ clang


【解决方案1】:

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

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

【讨论】:

  • 正式地说,它不是实现定义的,尽管它依赖于实现。当定义了实现时,实现必须记录它的作用。
  • 谢谢。我只是忘记包含 cstdio,但它仍然可以工作 - 这是编写任何其他编译器使用的代码时的问题。
  • 确实,席蒙。您的老师可能在学期开始时警告您,您的程序将在您学校的计算机上进行测试,并且您有责任确保它们在那里运行,无论您在哪里开发它们。我知道我们在课堂上发出过这样的警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 2011-08-01
  • 2020-12-07
  • 1970-01-01
相关资源
最近更新 更多