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


93

未使用の変数の警告をオフにするために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私の目標をオーバーライドしますか?


エラーメッセージが多かれ少なかれ言っているように、試してみてください-Werror=no-unused-variable
Joachim Isaksson 2013

回答:


236

-Wno-unused-variableスイッチは、通常のトリックを行います。ただし、プロジェクトでこれらのことを気にかけている場合は、これは非常に便利な警告です。GCCがコードにないものについて警告を出し始めると、それは煩わしくなります。

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

たとえば、ではなくと-IC:\\boost_1_52_0言い-isystem C:\\boost_1_52_0ます。

それが役に立てば幸い。幸運を!


この設定をどこに追加しますか?「プロジェクト設定/ AVR GNU Cコンパイラ/その他」の下でそれを行いましたが、無視されます(パスは正しいですが、警告が表示されます)ディレクトリ設定に追加すると(相対パスのチェックボックスをオフ)、AtmelStudioがクラッシュします。
hfrmobile 2014

3
また-Wno-unused-parameter、未使用の関数パラメーター、未使用の関数用 もあり-Wno-unused-functionます
Ngo Thanh Nhan

1
必要なもの:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer

81

安全のために、一部の警告のみを抑制し、他の警告を保持したい場合があります。コードでは、GCCの未使用の属性を使用して、変数や仮パラメーターの警告を抑制することができます。次のコードスニペットがあるとします。

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

この関数をハンドラーとして使用する必要がある場合があります。これは、(imho)C ++ Boostライブラリでは非常に一般的です。次に、2番目の仮パラメーターバージョンが必要です。になるため、関数のシグニチャーはハンドラーが必要とするテンプレートと同じになります。それ以外の場合、コンパイルは失敗します。しかし、関数自体にも実際には必要ありません...

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

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

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

PS:最近、私はこれを使用して、次のようにテンプレートでBoostsのシリアル化の警告を抑制しました:

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

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


7
仮パラメーターの場合は、名前を省略できます(例:)void func(unsigned number, const int)。そうすれば、gccは、unusedについても文句を言わなくなりversionます。
Olaf Dietsche 16年

@OlafDietscheこれgccは使用しているバージョンに依存すると思います。IIRC、私は4年前にそれを使用して、未使用に関する警告を抑制しなければなりませんでしたversion。;)
Dee'Kej

66

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

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

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



一般的に、あなたが本当に何をしているかを理解していない限り、または並列化にOpenMPを使用している場合を除き、#pragmaディレクティブの使用はあまり安全ではありません...;)
Dee'Kej

1
@ Dee'Kej #pragmaディレクティブは、それらをにラップすれば完全に安全です#ifdef some_compiler ... #endif。警告はコンパイラ固有の機能であり、標準では定義されていません。#pragmas がないコードからの警告は抑制できません。
コタウカス

@ vladislav-toncharov警告はコンパイラ固有のものです。ただし、ここではコンパイラの警告全般について話しているのではなく、特にGCCについて話している。言うまでもなく、#pragmaが有害でないことは正しいです。しかし、IMOの多くの人々は#pragmaを適切に使用する方法を知りません。そのため、私はそれを「危険」だと考えています(より良い言葉がないため)。
Dee'Kej

15

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つのみを説明しています。

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


警告の前に "no-"を付けることができることを知りませんでした。
RNA

10

使用-Wno-unused-variableはうまくいくはずです。


ああ、未使用の変数ではなく、未使用の変数!
WilliamKF 2013

5
または-Wno-error=unused-variable、エラーを削除して警告を保持したい場合。
Oskar N.

1
あなたは実際に実際の警告が何であるかを見ることができ[-Werror=unused-variable]ます。
Mats Petersson 2013

3

コンパイラは、すでにあなたを言っている、そうではありませんvalueけどvariable。あなたが探してい-Wno-unused-variableます。また、g++ --help=warnings利用可能なオプションのリストを表示してみてください。


3

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

あなたが訪問します ブーストのTracのをしてブーストに対するバグレポートを提出します。

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


0

-Wallそして-Wextra、GCCにステージを設定し-Wno-unused-variableます。その後のステップは有効になりません。たとえば、次の場合:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

その後、GCCは命令を確認します -Wall -Wextraを無視するようです-Wno-unused-variable

これは代わりに以下のようになり、コンパイルで未使用の変数が停止しないという望ましい効果が得られます。

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

「警告」対「エラー」と呼ばれる正当な理由があります。コードが完全ではない(アルゴリズムをスタブしているなど)ためにコンパイルが失敗すると、失敗する可能性があります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.