この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.
一般的に含まれるヘッダーには、特定の警告を生成したくないコードがあります。ただし、これらのヘッダーを含むファイルでは、引き続き警告が生成されます(プロジェクトで警告が有効になっている場合)。
これは 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 */
最も近いものは GCC診断プラグマ 、#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"
。それはあなたが望むものにあまり近くないので、詳細と警告についてはリンクを見てください。
同様のことをしました。サードパーティのコードについては、警告をまったく見たくありませんでした。したがって、-I/path/to/libfoo/include
を指定するのではなく、-isystem /path/to/libfoo/include
を使用しました。これにより、コンパイラは警告の目的でこれらのヘッダーファイルを「システムヘッダー」として扱い、-Wsystem-headers
を有効にしない限り、ほとんど安全です。私はまだそこからいくつかの警告が漏れているのを見ましたが、それはほとんどのジャンクを削減します。
Include --directoryで問題のコードを分離できる場合、これはonlyに役立ちます。それがあなた自身のプロジェクトのサブセットであるか、他のコードと混ざっている場合、あなたは運が悪いです。
これは 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