我正在编译一个包含sybdb.h的C程序,我在下面的typedef行中得到错误“声明说明符中的两个或更多数据类型”(sybdb.h是一个标准文件,不是我的一个)
#if !defined(_WINDEF_) && !defined(_WINDEF_H) && !defined(DOS32X)
typedef int BOOL;
#endif
似乎与我所包含的另一个库存在某种冲突,但不知道错误意味着什么或如何解决它。帮助
答案 0 :(得分:2)
很可能另一个标头(或您自己的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
未完成。然后它将使用您的(希望兼容的)系统定义。