5

これは私のコードです:

int main()
{
    uint64_t a = 100;
    uint32_t b = a;
    return 0;
}

Gcc コマンド:

~$ gcc -o 1 1.c -Wall
~$

誰でも助けてもらえますか?

4

2 に答える 2

6

-Wconversion オプションを使用します。

-Wconversion 値を変更する可能性のある暗黙の変換について警告します。これには、x が double の場合の abs (x) のような、実数と整数の間の変換が含まれます。unsigned ui = -1; のように、符号付きと符号なしの間の変換。sqrtf (M_PI) などの小さい型への変換。abs ((int) x) や ui = (unsigned) -1 のような明示的なキャスト、または abs (2.0) のように変換によって値が変更されない場合は警告しません。符号付き整数と符号なし整数の間の変換に関する警告は、-Wno-sign-conversion を使用して無効にすることができます。

C++ の場合、ユーザー定義の変換のオーバーロードの解決が混乱することについても警告します。型変換演算子を使用しない変換: void、同じ型、基本クラス、またはそれらへの参照への変換。-Wsign-conversion が明示的に有効にされていない限り、C++ では符号付き整数と符号なし整数の間の変換に関する警告はデフォルトで無効になっています。

あなたのコードで:

«uint64_t {aka long long unsigned int}» から «uint32_t {aka unsigned int}» への変換は、その値を変更する可能性があります [-Wconversion]

于 2013-03-25T08:26:40.957 に答える
2

-Wallすべての警告をオンにするのはよくある誤解です。

「マクロと組み合わせても、一部のユーザーが疑わしいと見なし、回避する(または警告を回避するために変更する)のが簡単な構造に関するすべての警告」をオンにします(GCCマニュアルを引用)。

" -Wall " では有効にならないいくつかの追加の警告フラグを有効にする-Wextraだけでも(GCC マニュアルから)。

また-pedantic、コードの意味がコンパイラにとって明確である場合に警告を生成する もありますが、標準では準拠するコンパイラにメッセージを発行するよう要求しています。(GCC のデフォルトでは、黙ってコンパイルを続行します)。

3 つすべてを有効にしても、コンパイラが提供できるすべての警告が表示されるわけではありません。詳細については、コンパイラのマニュアルを確認してください。

于 2013-03-25T08:30:38.947 に答える