2

私は次のように宣言された関数を持っています:

void    event_add_card (EventAddr addr, EventType type, unsigned char card);

と組合

typedef union EventData
{
    float           money;      /**< money info */
    unsigned char   card;       /**< new card */
}
EventData;

次のコードをコンパイルすると:

EventData data = {};

event_add_card (0,0, data.card);

警告が有効になっている-Wconversionと、次の警告が表示されます。

player-stud.c|71| warning: passing argument 3 of 'event_add_card' with different width due to prototype

gcc4が失敗する理由とそれを修正する方法???

4

2 に答える 2

3

4.3 より前のバージョンの gcc-Wconversionでは、プロトタイプがスコープ内にあるかどうかによって動作が異なる可能性がある場合に警告が生成されます。あなたが与える例では、引数3(data.card)はのunsigned charです。のプロトタイプevent_add_card()がスコープ内にある場合は として渡されますがunsigned char、プロトタイプがスコープ内にない場合は、intC の整数昇格規則により として渡されます。したがって、警告が表示されます。

これは、古い K&R スタイルのコードを変換してプロトタイプを使用するプロセスを除いて、あまり役に立ちません。そのため、古いバージョンの gcc を使用している場合、これを有効にするのは一般的に有用なオプションではありません。

gcc 4.3 以降、動作が変更されました: 値を変更する可能性のある暗黙の変換 (たとえば、符号付き整数と符号なし整数の間、または整数と浮動小数点数の間) について警告するようになりました。これはかなり便利です。(ただし、以前の機能はなくなっていません。引き続き使用できますが、名前が に変更されまし-Wtraditional-conversionた。)

(詳細はhttp://gcc.gnu.org/wiki/NewWconversionを参照してください。)

于 2010-04-14T23:08:36.283 に答える
1

問題は、 -Wconversion を使用していることです

コードに問題はありません。また、 -Wconversion でその警告が生成されないようにするためにできることは何もありません。

例:

void someFunction(unsigned char foo);
...
unsigned char bar = 'f';
someFunction(bar);

-Wconversion をコンパイルして使用すると、同じエラーが発生します。

-Wconversion は、K&R と ISO C の間で変換を行っていない問題を特定するためのものです。

于 2010-04-14T19:03:23.510 に答える