我正在編譯包含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