【发布时间】: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