【问题标题】:sybdb.h causing "two or more data types in declaration specifiers"sybdb.h 导致“声明说明符中有两种或多种数据类型”
【发布时间】:2012-01-27 22:47:49
【问题描述】:

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

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

似乎与我包含的另一个库存在某种冲突,但不知道错误的含义或如何修复它。帮忙?

【问题讨论】:

    标签: c compilation sybase typedef


    【解决方案1】:

    很可能 另一个 标头(或您的 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 没有完成。然后它将使用您的(希望兼容的)系统定义。

    【讨论】:

    • 就是这样 - 所以我添加了一个 ifndef 来跳过这个重新定义并且它停止了抱怨
    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2013-01-19
    • 2010-09-18
    • 2012-07-15
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多