2012-01-27 98 views
1

我正在编译包含sybdb.h的C程序,并在下面的typedef行中得到错误“声明说明符中有两种或多种数据类型”和sybdb.h是一个标准文件,不是我的)。sybdb.h在“声明说明符”中导致“两种或多种数据类型”

#if !defined(_WINDEF_) && !defined(_WINDEF_H) && !defined(DOS32X) 
typedef int BOOL; 
#endif 

它似乎有某种与其他图书馆我包括冲突的,但不知道是什么错误意味着或如何解决它。帮帮我?

回答

2

最有可能另一个头(或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不完成。然后它会使用你的(希望兼容的)系统定义。

+0

就是这样 - 所以我添加了一个ifndef来跳过这个重定义,它停止抱怨 – 2012-01-28 00:05:02