web-dev-qa-db-ja.com

#pragma警告を無効にする方法は?

C++アプリケーションの開発中に、使用されている無害な#pragmaディレクティブに関連する大量の警告を生成するサードパーティライブラリを使用する必要がありました。

../File.hpp:1: warning: ignoring #pragma ident
In file included from ../File2.hpp:47,
                 from ../File3.hpp:57,
                 from File4.h:49,

GNU C++コンパイラを使用している場合、この種の警告を無効にすることは可能ですか?

46
Marcos Bento

コンパイルできると思います

-Wno-unknown-pragmas

これらを抑制するために。

99
Adam Wright

GCCで、-Wno-unknown-pragmasを使用してコンパイルします

MS Visual Studio 2005(この質問はgccでタグ付けされていないため、参照用にこれを追加しています)では、[プロジェクト設定]-> [C/C++]-> [詳細設定]でグローバルに無効にできます。 「特定の警告を無効にする」に4068を入力します

または、これを任意のファイルに追加して、ローカルで警告を無効にすることができます

#pragma warning (disable : 4068 ) /* disable unknown pragma warnings */
24
Airsource Ltd

おそらく GCC Diagnostic Pragmas ?あるいは、この場合、 オプションの組み合わせ that -Wallを有効にします。ただし、-Wunknown-pragmas

18
Mike Dimmick

先端をありがとう。私の場合、Qt Mingwで作業しています。 .PROファイルで別の方法でフラグを設定する必要があります。

QMAKE_CXXFLAGS_WARN_ON += -Wno-unknown-pragmas
7

私は質問がGCCに関するものであることを知っていますが、これを可能な限り移植性のあるものにしたい人のために:

この警告を発することができるほとんどのコンパイラには、コマンドライン(例外:PGI)またはコード(例外:DMC)から警告を無効にする方法があります。

  • GCC:_-Wno-unknown-pragmas_/_#pragma GCC diagnostic ignored "-Wunknown-pragmas"_
  • clang:_-Wno-unknown-pragmas_/_#pragma clang diagnostic ignored "-Wunknown-pragmas"_
  • インテルC/C++コンパイラー:_-diag-disable 161_/#pragma warning(disable:161)
  • PGI:_#pragma diag_suppress 1675_
  • MSVC:_-wd4068_/#pragma warning(disable:4068)
  • TI:_--diag_suppress,-pds=163_/_#pragma diag_suppress 163_
  • IAR C/C++コンパイラ:_--diag_suppress Pe161_/_#pragma diag_suppress=Pe161_
  • Digital Mars C/C++コンパイラ:_-w17_

このほとんどを単一のマクロに組み合わせてコードで使用できます。これは、 Hedley_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS_ マクロに対して行ったことです。

_#if HEDLEY_HAS_WARNING("-Wunknown-pragmas")
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"")
#Elif HEDLEY_INTEL_VERSION_CHECK(16,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)")
#Elif HEDLEY_PGI_VERSION_CHECK(17,10,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675")
#Elif HEDLEY_GNUC_VERSION_CHECK(4,3,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"")
#Elif HEDLEY_MSVC_VERSION_CHECK(15,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068))
#Elif HEDLEY_TI_VERSION_CHECK(8,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
#Elif HEDLEY_IAR_VERSION_CHECK(8,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161")
#else
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
#endif
_

この回答を更新するのを忘れる可能性があるため、Hedleyはこの回答よりも完全な情報を持っている可能性があることに注意してください。 )上記の情報の代わりに、Hedleyをガイドとして使用できます。

バージョンチェックはおそらく過度に悲観的ですが、プロプライエタリコンパイラの古いバージョンについての良い情報を入手するのが難しい場合があり、申し訳ありませんが安全です。繰り返しになりますが、ヘドリーの情報の方が良いかもしれません。

多くのコンパイラは、警告をスタックにプッシュ/ポップすることもできるので、プッシュしてから、制御しないコードを含める前にそれらを無効にして、ポップすることができますyourコードは引き続き問題の警告をトリガーします(したがって、クリーンアップできます)。ヘドレーにもそのためのマクロがあります: _HEDLEY_DIAGNOSTIC_Push_ / _HEDLEY_DIAGNOSTIC_POP_

6
nemequ