1. ホーム
  2. gcc

GCCを使った警告メッセージの選択的削除

2023-09-22 10:13:52

質問

このコードの部分。

Int32 status;
printf("status: %x", status)

を実行すると、以下のような警告が表示されます。

jpegthread.c:157: warning: format '%x' expects type 'unsigned int', but argument 3 has type 'Int32'

型をキャストすることでこの警告を取り除くことができることは知っていますが、GCC コンパイラのフラグでこの特定のタイプの警告を取り除くことが可能で、なおかつ -Wall ?

どのように解決するのですか?

もし、このコードがポータブルに動作する必要があるなら、引数を 符号なしint にキャストする必要があります。

GCCで特定の警告を無効にすることについての質問に答えるために、GCCで特定の警告を有効にするには -Wxxxx で、それらを無効にするには -Wno-xxxx .

から GCC警告オプション :

で始まるオプションで、多くの特定の警告を要求することができます。 -W で始まり、例えば -Wimplicit を指定すると、暗黙的な宣言に対する警告を要求します。これらの警告オプションは、それぞれ否定形もあります。 -Wno- で始まる否定形があり、警告をオフにすることができます。 -Wno-implicit . このマニュアルでは、2つの形式のうち、デフォルトでない方のみを掲載しています。

あなたの場合、問題の警告は -Wformat

-Wformat

printf や scanf などの呼び出しをチェックして、与えられた引数が指定されたフォーマット文字列に適した型を持っているか、フォーマット文字列で指定された変換が意味をなしているかどうかを確認します。これには、標準的な関数や、format 属性で指定された他の関数も含まれます ( 関数属性 を参照)、printf、scanf、strftime、strfmon (an X/Open 拡張、C標準にはない)ファミリ(または他のターゲット固有のファミリ)。書式属性が指定されていない関数をチェックするかどうかは、選択された標準バージョンに依存し、属性が指定されていない関数のそのようなチェックを無効にするには -ffreestanding または -fno-builtin .

フォーマットは、GNU libc バージョン 2.2 でサポートされているフォーマット機能に対してチェックされます。これらには、すべてのISO C90とC99の機能、Single Unix仕様の機能、いくつかのBSDとGNUの拡張が含まれます。ほかのライブラリの実装はこれらの機能すべてをサポートしていないかもしれません。GCCは特定のライブラリの制限を越える機能についての警告をサポートしません。しかしながら、もし -pedantic と一緒に使われる場合 -Wformat と一緒に使うと、選択された標準のバージョンにないフォーマット機能について警告が出されます(ただし、strfmonのフォーマットはC標準のどのバージョンにもないので、警告されません)。C言語の方言を制御するオプション」を参照してください。