2012-01-27 3 views
1

sybdb.hを含むCプログラムをコンパイルしていますが、以下のtypedef行に "宣言指定子に2つ以上のデータ型" sybdb.hは標準ファイルであり、私のものではありません)。sybdb.hにより、宣言指定子に2つ以上のデータ型が発生する

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

私は含まれている他のライブラリと何らかの矛盾がありますが、エラーの意味や解決方法はわかりません。助けて?あなたのコンパイラが見られるように

#define BOOL unsigned char 

:実験ところで

typedef int unsigned char; 

答えて

2

ほとんどのヘッダ(またはC自体の実装が)のようなものを行っています私はコードをコンパイルする:

#define XYZZY unsigned char 
typedef int BOOL; 

int main (void) { 
    return 0; 
} 

それwo細かい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 -Egccに使用するオプションです。

固定することは別の問題です。エイリアスタイプの1つをBOOL1に変更するか、そのような非常に醜いものを変更する必要があります。私はそれがかなり使用されるだろうと想像して以来、それはより大きな変化になる可能性があります。

あなた単にBOOLの同じ定義を使用しますが、それはまだ、これは有害な副作用を持っていないことを確認するために、分析のかなりを取るの両方のサブシステムを確保して逃げることができるかもしれません。 typedefがないことを確認するために

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

、その後gcc -DSKIP_BOOL_DEF(または同等品)を使用してコードをコンパイルします。この修正プログラムをテストする(さらにおそらく実装)する

、あなたのような何かに#if文を変更することができます完了しました。それからあなたの(うまくいけば互換性のある)システム定義を使用します。

+0

それがそうだったので、この再定義をスキップするためにifndefを追加しました。 –

関連する問題