web-dev-qa-db-ja.com

翻訳単位の一部のみに対してGCC警告を選択的に無効にしますか?

このMSVCプリプロセッサコードに最も近いGCCとは何ですか?

#pragma warning( Push )                    // Save the current warning state.
#pragma warning( disable : 4723 )          // C4723: potential divide by 0
// Code which would generate warning 4723.
#pragma warning( pop )                     // Restore warnings to previous state.

一般的に含まれるヘッダーには、特定の警告を生成したくないコードがあります。ただし、これらのヘッダーを含むファイルでは、引き続き警告が生成されます(プロジェクトで警告が有効になっている場合)。

82
Jon-Eric

これは GCCで可能 バージョン4.6以降、またはトランクでは2010年6月頃です。

以下に例を示します。

#pragma GCC diagnostic Push
#pragma GCC diagnostic error "-Wuninitialized"
    foo(a);         /* error is given for this one */
#pragma GCC diagnostic Push
#pragma GCC diagnostic ignored "-Wuninitialized"
    foo(b);         /* no diagnostic for this one */
#pragma GCC diagnostic pop
    foo(c);         /* error is given for this one */
#pragma GCC diagnostic pop
    foo(d);         /* depends on command line options */
93
Matt Joiner

最も近いものは GCC診断プラグマ#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"。それはあなたが望むものにあまり近くないので、詳細と警告についてはリンクを見てください。

35
chaos

同様のことをしました。サードパーティのコードについては、警告をまったく見たくありませんでした。したがって、-I/path/to/libfoo/includeを指定するのではなく、-isystem /path/to/libfoo/includeを使用しました。これにより、コンパイラは警告の目的でこれらのヘッダーファイルを「システムヘッダー」として扱い、-Wsystem-headersを有効にしない限り、ほとんど安全です。私はまだそこからいくつかの警告が漏れているのを見ましたが、それはほとんどのジャンクを削減します。

Include --directoryで問題のコードを分離できる場合、これはonlyに役立ちます。それがあなた自身のプロジェクトのサブセットであるか、他のコードと混ざっている場合、あなたは運が悪いです。

32
Tom

これは Matt Joiner's answer への拡張です。

コード全体にプラグマを生成したくない場合は、 _ Pragma operator を使用できます。

#ifdef __GNUC__
#  define DIAGNOSTIC_ERROR(w) _Pragma("GCC diagnostic error \"" w "\"")
#  define DIAGNOSTIC_IGNORE(w) _Pragma("GCC diagnostic ignore \"" w "\"")
#  define DIAGNOSTIC_Push _Pragma("GCC diagnostic Push")
#  define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
#endif
// (...)

DIAGNOSTIC_ERROR("-Wuninitialized")
foo(a); // Error

DIAGNOSTIC_Push
DIAGNOSTIC_IGNORE("-Wuninitialized")
foo(a); // No error

DIAGNOSTIC_POP
foo(a); // Error
1
Cássio Renan