web-dev-qa-db-ja.com

編集したくないサードパーティコードでgccから出てくる未使用の変数警告を無効にするにはどうすればよいですか?

未使用の変数警告をオフにするためにgccコンパイラに渡すスイッチを知りたいですか? Windowsのブーストでエラーが発生しますが、ブーストコードを変更したくありません。

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

-Wunused-value-Wno-unused-valueの両方を使用しようとしましたが、どちらも上記のメッセージを抑制しませんでした。

正しいコマンドは何ですか、ここに私のコンパイル行があります:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

おそらく-Wallは私の目標をオーバーライドしますか?

81
WilliamKF

通常、-Wno-unused-variableスイッチを使用します。ただし、プロジェクトでこれらのことを気にかけている場合、これは非常に有用な警告です。ただし、GCCがコードに含まれていないものについて警告し始めると、面倒になります。

警告を保持することをお勧めしますが、サードパーティプロジェクトのインクルードディレクトリには-isystemの代わりに-Iを使用します。そのフラグは、GCCに、自分が制御できないものについて警告しないように指示します。

たとえば、-IC:\\boost_1_52_0の代わりに、-isystem C:\\boost_1_52_0と言います。

それが役に立てば幸い。がんばろう!

213
user405725

いくつかの警告のみを抑制する必要がある場合や、安全のために他の警告を保持したい場合があります。コードでは、GCCのunused属性を使用して、変数および仮パラメーターでさえ警告を抑制することができます。このコードスニペットがあるとしましょう:

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

この関数をハンドラーとして使用する必要がある場合、C++ Boostライブラリーでは非常に一般的な状況があります。次に、2番目の仮パラメーターversionが必要なため、関数の署名はハンドラーが必要とするテンプレートと同じです。そうでない場合、コンパイルは失敗します。ただし、関数自体にも実際には必要ありません...

警告から除外する変数または仮パラメーターをマークする方法は次のとおりです。

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

GCCには他にも多くのパラメーターがあり、manページで確認できます。これは、C++だけでなくCプログラムでも機能し、ハンドラーだけでなく、ほぼすべての関数で使用できると思います。さあ、試してみてください! ;)

追伸:最近、テンプレートでBoostsのシリアル化の警告を抑制するためにこれを使用しました:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

編集:どうやら、私はあなたの必要に応じてあなたの質問に答えなかったようです、 drak0sha それを良くしました。私は主に質問のタイトルに続いたからです。うまくいけば、これはそのタイトルのためにここに来る他の人々を助けるかもしれない... :)

69
Dee'Kej

Gccを使用しており、選択したコードの警告を無効にする場合は、#pragmaコンパイラディレクティブを使用できます。

#pragma GCC diagnostic Push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

制御するコードについては、__attribute__((unused))を使用して、特定の変数が使用されないことをコンパイラーに指示することもできます。

62
Ole Wolf

警告オプションの man gcc を参照してください。そこには、unusedがたくさんあります

警告オプション
... -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable

それらのいずれかにno-をプレフィックスすると、この警告が無効になります。

多くのオプションには、-fまたは-W ---で始まる長い名前が付いています。たとえば、-fmove-loop-invariants、-Wformatなどです。これらのほとんどは、正と負の両方の形をしています。 -ffooの否定形は-fno-fooになります。このマニュアルでは、これら2つの形式のうち、デフォルトではない方のいずれか1つのみを文書化します。

より詳細な説明は 警告を要求または抑制するオプション にあります。

15
Olaf Dietsche

-Wno-unused-variableを使用すると動作するはずです。

9
Mats Petersson

Gccから出力される未使用の変数警告を無効にするにはどうすればよいですか?
Windowsのブーストでエラーが発生しますが、ブーストコードに触れたくありません...

Boost's Trac にアクセスして、Boostに対するバグレポートを提出します。

アプリケーションは、ライブラリの警告とエラーをクリアする責任を負いません。ライブラリは、独自の警告とエラーをクリアする責任があります。

3
jww

コンパイラはすでにあなたに言っています、それはvalueではなくvariableです。 -Wno-unused-variableを探しています。また、g++ --help=warningsを試して、使用可能なオプションのリストを確認してください。

3
Daniel Frey