1

これは例です:

#include <stdbool.h>

void foo(bool b){};
void bar(bool b) {foo(b);}

int main() {
    bar(false);
}

私は次のようにコンパイルします:

gcc -Wtraditional-conversion test.c

次の警告が表示されます。

test.c: In function 'bar':
test.c:4: warning: passing argument 1 of 'foo' with different width due to prototype
test.c: In function 'main':
test.c:7: warning: passing argument 1 of 'bar' with different width due to prototype

なぜこれらの警告が発生するのですか?私が見る限り、引数はすべて同じタイプなので、同じ幅にする必要があります。この非常に単純なコードでこれらの警告を発生させるために-Wtraditional-conversionは何をしていますか?

自分のtypedefのboolからstdbool.hdefに切り替えたときに、これらのエラーが発生し始めました。

私の元の定義は次のとおりです。

typedef enum {false, true} bool;
4

2 に答える 2

2

これは、コンパイラの警告フラグを理解していない場合でした。

暗黙的な変換について警告する警告を受け取ら-Wconversionないように使用します。プロトタイプがない場合の変換について警告するためのものです。-Wtraditional-conversion-Wtraditional-conversion

typdef enumがデフォルトの整数 bool 型 (通常は 32 ビット) を作成するのに対し、asstdbool.hは bool を C++ bool と互換性のある 8 ビットとして定義するため、キャッチされました。

于 2012-05-24T08:54:03.610 に答える
0

barコンパイラにペンダントを要求するため、への呼び出しに対する警告は正しいです。は定数にfalse展開されるため、 (または)ではありません。int0bool_Bool

最初の警告はバグです。

于 2012-05-14T10:23:51.347 に答える