web-dev-qa-db-ja.com

ライブラリヘッダーからGCC警告を抑制する方法

Log4cxx、boostなどのライブラリを使用するプロジェクトがあり、そのライブラリのヘッダーは多くの(繰り返しの)警告を生成します。ライブラリインクルード(#include <some-header.h>)または特定のパスからのインクルードからの警告を抑制する方法はありますか?関連する情報が不明瞭になることなく、プロジェクトコードで通常どおり-Wallおよび/または-Wextraを使用したいと思います。現在、make出力でgrepを使用していますが、もっと良いものが欲しいです。

114
AdSR

-isystemの代わりに-Iを使用してライブラリヘッダーを含めることを試みることができます。これにより、それらは「システムヘッダー」になり、GCCはそれらの警告を報告しません。

116
Phi

CMakeを使用している場合は、include_directoriesヘッダーに対する警告を抑制するシンボルSYSTEMを含めるディレクティブ。

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^
92
Drew Noakes

プラグマを使用できます。例えば:

// 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
48
andrewrjones

トリックを見つけました。ライブラリインクルードの場合、-Idirの代わりに、メイクファイルで-isystem dirを使用します。 GCCは、システムがそれらからの警告を含めて無視するため、ブーストなどを扱います。

25
AdSR

#pragmaはコンパイラーへの指示です。 #includeの前に何かを設定し、後で無効にすることができます。

コマンドライン でも実行できます。

警告を無効にする に関する具体的な別のGCCページ。

ソースコード内で#pragmaを使用して、sound理由(コメントとして)を無効にする理由を提供するオプションを選択します警告。これは、ヘッダーファイルに関する推論を意味します。

GCCは classifying 警告タイプによってこれにアプローチします。それらを警告または無視するように分類できます。以前にリンクされた記事は、どの警告が無効にされる可能性があるかを示します。

注: attributes ;を使用して、特定の警告を防ぐためにソースコードを処理することもできます。ただし、これはGCCに非常に密接に結びついています。

注2:GCCはMicrosoftのコンパイラで使用されている pop/Pushインターフェース も使用します。Microsoftはこのインターフェースを介して警告を無効にします。私はそれが可能かどうかわからないので、これをさらに調査することをお勧めします。

8
Hassan Syed

プリコンパイル済みヘッダー を使用して試すことができます。警告は消えませんが、少なくともメインコンピレーションには表示されません。

4

システムヘッダーを明示的にオーバーライドする必要がある場合は、プラグマに制限されます。使用しているインクルードを確認するには、make depend出力。

gcc> = 4.6の診断プッシュポップ も参照してください

1
supaflav

以下を置く

#pragma GCC system_header

このファイル内の以下のすべてのコードのGCC警告をオフにします。

0
Evgenii