web-dev-qa-db-ja.com

警告メッセージGCCを選択的に削除

次のコード:

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

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

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

型をキャストすることでそれを取り除くことができることは知っていますが、GCCコンパイラフラグを使用してその特定の種類の警告を取り除き、-Wallを使用することは可能ですか?

35
shodanex

そのコードを移植可能にする必要がある場合、int型はプラットフォームによってはInt32とは異なるサイズになる可能性があるため、引数をunsigned intにキャストする必要があります。

Gccで特定の警告を無効にすることに関する質問に答えるには、-Wxxxxでgccの特定の警告を有効にし、-Wno-xxxx

GCC警告オプション から:

-Wで始まるオプションを使用して、多くの特定の警告を要求できます。たとえば、-Wimplicitは、暗黙の宣言に関する警告を要求します。これらの特定の警告オプションにはそれぞれ、警告をオフにする-Wno-で始まる負の形式もあります。たとえば、-Wno-implicit。このマニュアルでは、2つの形式のうち、デフォルトではない方のいずれかのみをリストしています。

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

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

形式は、GNU libcバージョン2.2でサポートされている形式機能に対してチェックされます。これらには、すべてのISO C90およびC99機能、Single Unix Specificationの機能、いくつかのBSDおよびGNU拡張機能。他のライブラリ実装はこれらのすべての機能をサポートしない可能性があります。GCCは特定のライブラリの制限を超える機能に関する警告をサポートしません。ただし、-pedantic-Wformat選択された標準バージョンにないフォーマット機能に関する警告が表示されます(ただし、C規格のどのバージョンにも含まれていないため、strfmonフォーマットではありません)。

74
lothar

GCCマニュアルは、実際には#pragmaを使用してこれを行う方法を提供しているようです。 (ここでの別の答えでアイデン・ベルが言ったことに反して)

http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html

例えば-Wuninitialized警告の場合、次のことができます...

#pragma GCC diagnostic ignored "-Wuninitialized"

...警告を抑制する、または...

#pragma GCC diagnostic warning "-Wuninitialized"

... -Werrorを使用してビルドしている場合でも、警告として(エラーではなく)処理します。

29
dholbert

次のCFLAGSを使用しました。

-Wall -Wformat=0
10
shodanex

あなたが探していると思います

#ifdef WIN32
#pragma warning (disable: #num of the warning) 
#endif

GCCで同等...

ここで仕事をする-Wno-conversion -Wno-format-securityなどのオプションを検索できます

http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Warning-Options.html

しかし、#pragmaディレクティブに関しては:

GoogleのGCCメーリングリストから引用

GCCは現在、探している#pragma機能を提供していません。

希望を失うな!実行可能な選択肢があります。

警告を発しないようにコードを修正する最初の最良の方法。残念ながら、これはできないと述べています。 :

注:チームが許容できる範囲で詳細な警告を出します! [下記参照]

望ましくない警告を無視するための次善の方法は、GCCの出力を、無視する特定の正確な警告を取り除くスクリプト(Perlスクリプトなど)に後処理することです。

望ましくない警告を無視する次の方法は、その翻訳単位の警告を無効にすることです。 -Wno-foozle-mcgoogle、その特定の翻訳単位のみ。しかし、それは強力な大きなハンマーです。また、警告がヘッダーファイルにある場合は、プロジェクト全体に広まっている可能性があります。後処理スクリプトソリューションを紹介します(コードの修正が許可されていない場合)。

そのため、現在のところ、特定の警告を無効にする#pragmaディレクティブはありません。 -Wallを使用する代わりに、特定の警告を差し引くことができる限り多くの警告をオンにすることができます。

---(http://www.network-theory.co.uk/docs/gccintro/gccintro_31.html

またはコードを修正

1
Aiden Bell