我正在编译包含sybdb.h的C程序,并在下面的typedef行中得到错误“声明说明符中有两种或多种数据类型”和sybdb.h是一个标准文件,不是我的)。sybdb.h在“声明说明符”中导致“两种或多种数据类型”
#if !defined(_WINDEF_) && !defined(_WINDEF_H) && !defined(DOS32X)
typedef int BOOL;
#endif
它似乎有某种与其他图书馆我包括冲突的,但不知道是什么错误意味着或如何解决它。帮帮我?
我正在编译包含sybdb.h的C程序,并在下面的typedef行中得到错误“声明说明符中有两种或多种数据类型”和sybdb.h是一个标准文件,不是我的)。sybdb.h在“声明说明符”中导致“两种或多种数据类型”
#if !defined(_WINDEF_) && !defined(_WINDEF_H) && !defined(DOS32X)
typedef int BOOL;
#endif
它似乎有某种与其他图书馆我包括冲突的,但不知道是什么错误意味着或如何解决它。帮帮我?
最有可能另一个头(或C本身的实现)做了这样的:
#define BOOL unsigned char
让你的编译器是看到:
typedef int unsigned char;
通过实验的方式,当我编译代码:
#define XYZZY unsigned char
typedef int BOOL;
int main (void) {
return 0;
}
它窝RKS不错,但,当我改变的是第一线,#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
不完成。然后它会使用你的(希望兼容的)系统定义。
就是这样 - 所以我添加了一个ifndef来跳过这个重定义,它停止抱怨 – 2012-01-28 00:05:02