很可能 另一个 标头(或您的 C 本身的实现)做了类似的事情:
#define BOOL unsigned char
让你的编译器看到:
typedef int unsigned char;
通过实验,当我编译代码时:
#define XYZZY unsigned char
typedef int BOOL;
int main (void) {
return 0;
}
它工作正常,但是当我将第一行更改为 #define BOOL unsigned char 时,我收到的消息与您看到的完全相同:
qq.c:2:17: error: two or more data types in declaration specifiers
qq.c:2:5: warning: useless type name in empty declaration
要确认这一点,您可以只编译预处理器阶段,以查看该代码在编译器阶段的真实样子。
这取决于编译器,当然,gcc -E 是您将用于gcc 的选项。
修复它是另一回事。您可能必须将其中一种别名类型更改为 BOOL1 或类似的丑陋的东西。这可能是一个更大的变化,因为我想它会被使用很多。
您也许只需确保两个子系统使用相同的BOOL 定义就可以侥幸逃脱,但仍需要进行大量分析才能确认这不会有不利的一面效果。
要测试(甚至可能实施)此修复,您可以将 #if 语句更改为:
#ifndef SKIP_BOOL_DEF
#if !defined(_WINDEF_) && !defined(_WINDEF_H) && !defined(DOS32X)
typedef int BOOL;
#endif
#endif
然后使用gcc -DSKIP_BOOL_DEF(或等效项)编译您的代码,以确保typedef 没有完成。然后它将使用您的(希望兼容的)系统定义。