我该如何控制gcc/g++自动包含头文件的方式?

10

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

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

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

当我忘记包含某些内容,然后从未收到错误直到我去在另一个系统上编译代码时,它会造成混乱。此时,需要在整个项目中运行并修复包含问题。

有其他人遇到过这种情况吗?是否有一种方法可以强制gcc自动包含或不自动包含?或者,是否有一种方法可以知道它正在自动包含什么


4
你确定这不是其他标题在拉动这些标题,在其他平台上没有这样做吗? - Preet Sangha
2
gcc不会自动包含任何文件 - 你可能只是通过你明确使用 #include 包含的头文件间接地包含了它们。总之:你需要修复你的代码。 - Paul R
@amaurea:当你说“编译正常”时,我怀疑你(a)正在编译C代码而不是C++,以及(b)依赖于C89行为,在此行为中,您可以在使用之前不声明函数。然而,这非常不可靠,特别是在64位系统上,因为指针参数将被假定为int。 - Paul R
@PaulR:你说得对,这是C代码。我没有想到这可能是因为函数被接受而不需要任何声明。我曾经认为它们以某种方式默认包含在内。虽然我并不主张依赖这一点,但我遇到了与原帖作者相同的情况,在其中一些编译器上编译正常,而另一些则会出现未定义的函数错误。在这种情况下,解决方法就是指定一个比C89更新的标准,我想。 - amaurea
@amaurea:是的,通常编译时至少要加上-Wall,如果可能的话也要加上-pedantic——这样你就不会依赖于隐式整型、未声明的原型等东西了。 - Paul R
显示剩余4条评论
3个回答

5
-include file 将文件处理为如果#include“file”出现在主源文件的第一行时的形式。但是,用于查找文件的第一个目录是预处理器的工作目录,而不是包含主源文件的目录。如果在那里找不到,则像往常一样在其余的#include“…”搜索链中搜索它。 如果给出了多个-include选项,则按照它们在命令行上出现的顺序包含这些文件。 http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

3
你确定不是其他标头将它们拉进来了,在其他平台上却没有这样做吗?

0

在不同的系统上编译时,可能会遇到不同的问题,而且不仅仅是包含问题。

我建议您投资于一个连续构建系统,在代码更新后会在所有需要的操作系统上进行编译,这样您就能迅速了解任何可移植性问题。

您还可以将所有常用的系统头文件放在一个特定的头文件中,并在所有文件中系统地包含它。


这是一个好的建议,但在某种情况下,这是一个第三方库(OpenSceneGraph的旧版本)和一些旧代码,在升级到较新版本的gcc时出现了问题。自动编译多个操作系统在这里无法帮助,我怀疑问题只是因为在gcc版本之间,系统包含文件中的#includes被重新组织了 :/ - Dave Ceddia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接