【问题标题】:How can I control the way gcc/g++ automatically includes headers?如何控制 gcc/g++ 自动包含标头的方式?
【发布时间】:2011-04-25 22:08:11
【问题描述】:

过去,当我尝试将一些在 Mac OS X 上编写的 C++ 代码移植到 Linux 系统,或者尝试使用较新版本的 gcc/g++ 编译针对旧版本的 gcc/g++ 编写的代码时,我遇到了麻烦:

似乎某些(旧的?)版本的 gcc/g++ 会自动为您包含一些头文件。

例如,使用printf 的代码应该需要#include <stdio.h>。使用memcpy 的代码应该需要#include <string.h>。但根据我使用的 gcc 版本,它偶尔会为我包含这些。

当我忘记包含某些内容然后永远不会出错时,它会造成严重破坏,直到我在另一个系统上编译代码。在这一点上,这是一个在整个项目中运行并修复包含的游戏。

还有其他人遇到过这种情况吗?有没有办法强制 gcc 自动包含或不自动包含?或者,有没有办法知道它自动包含什么

【问题讨论】:

  • 如果 gcc 自动执行它,它可能会变得过于微妙,无法理解不同库中相同的方法名称。但如果有一些自动解决方案我想知道。
  • 您确定不是其他标头将这些标头拉入,而在其他平台上没有这样做?
  • gcc 不会“自动包含” - 正如 Preet 上面建议的那样,您可能只是通过明确#included 的标头获得间接包含。底线:你需要修复你的代码。
  • @Preet,感谢您的建议。我敢打赌这就是正在发生的事情。如果您想将该建议作为答案,我会勾选它。
  • @PaulR:不,gcc 会“自动包含”内容。在我可以访问的几台计算机上,int main(){printf("Hello world\n");} 编译良好,没有任何包含。我已经在 linux 上使用 gcc 4.6.3、gcc 4.9.2 和 clang 3.5.0 进行了测试。但是在mac上它不起作用。所以这显然取决于系统,我希望它被记录在某个地方。太糟糕了,这里的海报最终得到了错误的答案。

标签: gcc include g++ header compilation


【解决方案1】:

-包含文件 处理文件,好像#include "file" 出现在主要源文件的第一行。但是,搜索文件的第一个目录是预处理器的工作目录,而不是包含主源文件的目录。如果在此处未找到,则会在 #include "..." 搜索链的其余部分中正常进行搜索。 如果给出了多个 -include 选项,则文件将按照它们在命令行中出现的顺序包含在内。

http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

【讨论】:

    【解决方案2】:

    您确定不是其他标头将这些标头拉入,而在其他平台上没有这样做吗?

    【讨论】:

      【解决方案3】:

      在不同系统上编译时,您可能会遇到不同的问题,而不仅仅是包含。 我建议投资一个持续构建系统,该系统将在每次更新代码后在您需要的所有操作系统上编译,这样您就可以迅速意识到任何可移植性问题。

      您还可以将所有常见的系统头文件放在您将编写的特定头文件中,并将其系统地包含在您的所有文件中。

      【讨论】:

      • 这是一个很好的建议,但在一种情况下,它是第三方库(OpenSceneGraph 的旧版本)和一些旧代码在升级到新版本的 gcc 时损坏。多个操作系统的自动编译在这里没有帮助,我怀疑问题可能只是系统内的#includes包含文件在gcc版本之间重新组织:/
      猜你喜欢
      • 2021-11-24
      • 2011-01-09
      • 2014-08-19
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多