2012-01-27 123 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

相關問題