#pragma 警告を無効にするにはどうすればよいですか?
-
02-07-2019 - |
質問
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++ コンパイラを使用する場合、この種の警告を無効にすることはできますか?
解決
でコンパイルできると思います
-Wno-unknown-pragmas
これらを抑えるために。
他のヒント
GCC では、-Wno-unknown-pragmas を指定してコンパイルします。
MS Visual Studio 2005 (この質問には gcc のタグが付けられていないため、参考のために追加しています) では、[プロジェクト設定] -> [C/C++] -> [詳細] でグローバルに無効にすることができます。「特定の警告を無効にする」に「4068」と入力します。
または、これを任意のファイルに追加してローカルで警告を無効にすることもできます
#pragma warning (disable : 4068 ) /* disable unknown pragma warnings */
おそらく見てください GCC 診断プラグマ?あるいは、この場合は、 オプションの組み合わせ それ -Wall
を有効にし、除外します -Wunknown-pragmas
.
ヒントをくれた皆さん、ありがとう。私の場合、Qt Minw を使用しています。.PRO ファイルで別の方法でフラグを設定する必要があります。
QMAKE_CXXFLAGS_WARN_ON += -Wno-unknown-pragmas
質問が GCC に関するものであることは承知していますが、これをできるだけ移植可能にしたい人のために:
この警告を発行できるほとんどのコンパイラには、コマンド ラインから警告を無効にする方法があります (例外:PGI) またはコード内 (例外:DMC):
- GCC:
-Wno-unknown-pragmas
/#pragma GCC diagnostic ignored "-Wunknown-pragmas"
- カラン:
-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
これらのほとんどを 1 つのマクロに結合してコード内で使用できます。これは私が行ったことです。 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 だけを使用したくない場合は(これはプロジェクトに簡単にドロップできる単一のパブリックドメイン C/C++ ヘッダーです) ) 上記の情報の代わりに Hedley をガイドとして使用するとよいでしょう。
バージョン チェックはおそらく過度に悲観的ですが、プロプライエタリ コンパイラの古いバージョンに関する適切な情報を入手するのが難しい場合もあるので、残念がるよりは安全を確保したいと思います。繰り返しますが、Hedley の情報の方が優れている可能性があります。
多くのコンパイラは警告をスタックにプッシュ/ポップできるため、制御していないコードを含める前に警告をプッシュして無効にし、その後ポップすることができます。 あなたの コードは引き続き問題の警告をトリガーします (そのため、クリーンアップできます)。Hedley にはそのためのマクロもあります。 HEDLEY_DIAGNOSTIC_PUSH
/ HEDLEY_DIAGNOSTIC_POP
.