sybdb.h导致“声明说明符中的两个或多个数据类型”

时间:2012-01-27 22:47:49

标签: c compilation sybase typedef

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

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

似乎与我所包含的另一个库存在某种冲突,但不知道错误意味着什么或如何解决它。帮助

1 个答案:

答案 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未完成。然后它将使用您的(希望兼容的)系统定义。