log4cxx、boost などのライブラリを使用するプロジェクトがあり、そのヘッダーは多くの (反復的な) 警告を生成します。ライブラリ インクルード (つまり #include <some-header.h>) または特定のパスからのインクルードからの警告を抑制する方法はありますか? 関連情報が不明瞭になることなく、プロジェクトコードで通常どおり-Wallおよび/または-Wextraを使用したいと思います。現在、make 出力で grep を使用していますが、もっと良いものが欲しいです。
10 に答える
-isystem
の代わりにを使用してライブラリヘッダーを含めることができます-I
。これにより、それらは「システムヘッダー」になり、GCCはそれらの警告を報告しません。
CMake を使用している場合は、include_directories
ディレクティブを変更して、そのSYSTEM
ようなヘッダーに対する警告を抑制するシンボルを含めることができます。
include_directories(SYSTEM "${LIB_DIR}/Include")
^^^^^^
プラグマを使用できます。例えば:
// save diagnostic state
#pragma GCC diagnostic push
// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>
// turn the warnings back on
#pragma GCC diagnostic pop
コツを見つけました。makefileで-Idir
使用する代わりに、ライブラリ インクルードの場合。-isystem dir
次に、GCC はブーストなどをシステム インクルードとして扱い、それらからの警告を無視します。
#pragma
コンパイラへの指示です。#include の前に何かを設定し、後で無効にすることができます。
コマンド ラインで実行することもできます。
特に警告の無効化に関する別の GCC ページ。
ソース コード内で #pragma を 使用し、警告を無効にする理由を (コメントとして)提供するオプションを選択します。これは、ヘッダー ファイルに関する推論を意味します。
GCC は、警告の種類を分類することでこれに取り組みます。それらを警告または無視するように分類できます。以前にリンクされた記事には、どの警告が無効になっている可能性があるかが示されています。
注: attributesを使用して、特定の警告を防ぐためにソース コードをマッサージすることもできます。ただし、これは GCC に非常に密接に結び付いています。
注 2: GCC は、Microsoft のコンパイラで使用されているpop/push インターフェイスも使用します。Microsoft は、このインターフェイスを介した警告を無効にします。可能かどうかさえわからないので、これをさらに調査することをお勧めします。
プリコンパイル済みヘッダーの使用を試すことができます。警告はなくなりませんが、少なくともメインのコンパイルには表示されません。
システム ヘッダーを明示的にオーバーライドする必要がある場合は、プラグマに制限されます。make depend
出力を介して、使用しているインクルードを確認できます。
gcc >= 4.6 の診断プッシュポップも参照してください。
これらの警告には理由があるはずです。これらは、ライブラリを使用するコードのエラー、またはライブラリ コード自体のエラーが原因で発生します。最初のケースでは、コードを修正してください。2 番目のケースでは、ライブラリの使用を停止するか、FOSS コードの場合は修正します。