翻訳単位の一部のみに対する GCC 警告を選択的に無効にしますか?
-
12-09-2019 - |
質問
この 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以降、または6月の周りに可能ですトランク内2010ます。
ここでは一例です。
#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
を有効にしないと、あなたは主に安全だなります。私はまだいくつかの警告が外に漏れて見てきましたが、それはジャンクのほとんどが削減ます。
あなたはインクルードディレクトリで問題のあるコードを分離することができた場合、これはののみのはあなたを助けることに注意してください。それはあなた自身のプロジェクトのほんの一部だ、あるいは他のコードと混在した場合、あなたは運の外出ます。
これは~への拡張です マット・ジョイナーの答え.
コード全体にプラグマを生成したくない場合は、 _プラグマ演算子:
#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