【发布时间】:2013-09-30 18:51:27
【问题描述】:
我想知道是否可以使用 GCC 强制执行直接 #include 要求。假设我有这些文件:
abc.h:
typedef struct {
int useful;
} str;
file1.h:
#include <abc.h>
#ifndef GUARD
#define GUARD
#include <deh.h>
typedef struct {
int useful;
} str2;
#endif
file2.h:
#ifndef GUARD2
#define GUARD2
#include <file1.h>
void a_function (str* my_str);
void a_function2(str2* my_str);
#endif
问题是“file2.h”正在使用“abc.h”中定义的“str”。假设“file1.h”是由某些 Linux 系统上的系统提供的。我无法控制“file1.h”的内容。如果可能包括也可能不包括,它可能在内部也可能不包括警卫,它可能会或可能不会随着时间的推移而改变。
问题在于支持多个发行版和系统。如果 file2.h 不小心使用了 "str" 而没有 include ,它可能在大多数系统上仍然可以编译,但在其他系统上可能会失败,或者将来当 "file1.h" 更改时。
有没有办法强制 GCC(或 LLVM)只使用在 file2.h 中直接定义的类型?我知道“#include”只是包含,所以编译器内部可能不会在预处理器阶段之后意识到这些问题,但是,我想知道这目前是否可行,如果可以,如何实现?
我在使用“普通”Linux 发行版时遇到过这个问题,但在早期的 Android NDK 版本中情况更糟。
【问题讨论】:
-
好吧,为什么不先包含 abc.h 呢?
-
更好的是,
file2.h应该#include什么都没有。我觉得这个问题不清楚。 在这种情况下你希望编译器做什么? -
@Beta:对于“扁平化包含并将它们全部放在主源文件中”的方法肯定没有达成共识。这就是你所提倡的吗?
-
@zneak:问题在于开发人员何时忘记包含所有必需的文件。在某些情况下,因为它们是间接包含的,所以无论如何它都会编译,因此开发人员不会注意到。当您无法控制的文件包含间接包含的文件时,这会导致问题。在这种情况下,当该文件的第三方所有者更改它时,可能会导致编译错误。
-
@BenVoigt:不,我是说省略(而不是扩展)
#include语句是实现 OP 既定目标的明智方式。
标签: c++ c gcc compiler-errors compiler-warnings