2009-06-08 18 views
79

このMSVCプリプロセッサコードに最も近いGCCは何ですか?翻訳単位の一部についてのみ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. 

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

+0

ヘッダが、/ usr/includeまたはデフォルトでは彼らのために警告を生成しませんgccの何を持っているためにインストールされている場合:

は、ここでの例です。 – Spudd86

答えて

86

トランク内のバージョン4.6以降、または2010年6月頃からpossible in GCCです。

#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 */ 
+6

gcc 4.6のpushおよびpop機能が追加されました(http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Diagnostic-Pragmas.html)。 –

+0

あなたが2度ポップする場合は、おそらく2度押したいと思うでしょう。 – Dan

+1

@ダン:マニュアルを読み、コメントしてください。この例の起源に注意してください。 –

34

最も近いのはGCC diagnostic pragma#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"です。それはあなたが望むものに非常に近いものではなく、詳細や注意点のリンクを参照してください。

+1

この機能を追加しない理由とその理由は何ですか? (私はそれを見つけることができませんでした)私は警告push-disable-popが有用であることがわかりました。 –

+1

gccに「機能を追加しない」ということは、実際に動作するパッチを提出する人がいないという根拠を持つ傾向があるとは思いません。 – chaos

+13

gccのこのようなきめ細かな警告制御のための作業をしたり、コードを提出したいという人は誰もいません - 既にこれを行ったシリコンバレーの大手企業と、支払うことに喜んでいた誰かがそれを行い、ストリームにコードを取得する。むしろ、(gdbのメンテナの1人として)このようなものにプラグインされている人との議論では、gccのメンテナは "警告があれば、それはバグであり、修正する必要があります。だから、宗教的な主張であり、彼らが勝つようにコードを制御します。 –

31

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

このは、問題のコードをインクルードディレクトリで隔離することができます。それがあなた自身のプロジェクトの一部である場合、または他のコードと混在している場合、あなたは不運です。

+1

シンプルで効果的です、ありがとうございます! – GvS

+1

素晴らしいチップ。 LLVMを使用している場合は、「Apple LLVM Compiler-Language」セクションの「Other C Flags」の下に-isystemフラグを追加します。 – Nestor

+0

@Tom共有いただきありがとうございます。私はあなたのソリューションをどこで使うべきか理解できません。もう少し言えますか? –

関連する問題