我想知道是否可以使用 GCC 强制执行直接 #include 要求。假设我有这些文件:
abc.h:
typedef struct {
int useful;
} str;
文件1.h:
#include <abc.h>
#ifndef GUARD
#define GUARD
#include <deh.h>
typedef struct {
int useful;
} str2;
#endif
文件2.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 版本中情况更糟。