質問
C ++プロジェクトに取り組んでいますが、未使用のパラメーターに関する警告が多数あることに気付きました。
これらの警告が無視された場合、どのような影響がありますか?
解決
次の場合、未使用のパラメータを持つ関数には実際のバグがある可能性があります。
-
output パラメーターがありますが、このパラメーターは割り当ても書き込みもされていないため、呼び出し元の値は未定義になります。
-
パラメーターの1つはコールバック関数ポインターです。これは、呼び出す必要があります。関数に多くの
#ifdef
がある場合に発生する可能性があります。 -
パラメーターをシャドウする同じ名前のローカル変数を宣言し、その後関数で間違った値を使用します。
input パラメーターを使用しない は無害かもしれませんが、キャストすることで関数の先頭で未使用の入力パラメーターを明示的にマークすることで、有用な警告を表示してノイズを減らすことができます void
にします(CとC ++の両方で動作します):
(void)param1;
または、
#define UNUSED(expr) do { (void)(expr); } while (0)
...
void foo(int param1, int param2)
{
UNUSED(param2);
bar(param1);
}
またはパラメーター名を省略します(C ++のみ):
void foo(int param1, int /*param2*/)
{
bar(param1);
}
他のヒント
重要ではない重要でない警告が大量にある場合は、作成したばかりのコード行の中央に隠れている重要な警告を見落とす可能性があります。
警告を無効にするgcc固有の方法については、 __ attribute __((unused))
を使用できます
void foo(int a, int b __attribute__((unused))) {
}
2番目のパラメーターを無視します。プログラムが既にGCCテクノロジーに依存している場合、その種類の警告から100%安全であるためにその属性を使用できます。
これは、パラメーターを使用するが、パラメーターを使用しない関数を作成したことを意味します。無害ですが、場合によってはバグを示している可能性があります。
通常、パラメーター名を削除して匿名のままにすることでこの警告を黙らせることができますが、パラメーターが使用されない理由によっては望ましくない場合があります。
実際の問題を見つけるのが難しくなっている場合は、警告をオフにすることをお勧めします。
C ++では、デフォルトの引数を使用できます:
int sum(int first, int second=0){ // should not give warning
return first+first;
}
追加の引数を指定することもできます:
int sum(int first, int second){ // should give warning
first *= 2;
return first;
}
使用していないパラメーターがあり、 がデフォルトになっていない場合は、参照されない追加の値をスタックに渡すようプログラムに要求しているため、警告が表示されます。したがって、必要以上の作業を行っています。
多分、関数ロジックの一部を忘れたことを意味します。
なし。 [編集]を除く:他の人が指摘したように、割り当てられていない出力パラメーターを持つことができます。
それらをクリーンアップする必要があります。多くの場合、開発者は多数の警告の中で「隠された」重要な警告を無視しており、警告を見ることに慣れていたため、注意を払っていませんでした。常に警告をゼロにして、コンパイラの警告を最大レベルに設定しようとしています。
これは、パラメーターを使用するかどうかによって異なります。例:
const int Size = 12; // intended for use in some other function
char* MakeBuffer(int size)
{
return new char[Size];
}
このコードでは、「サイズ」は使用されず、代わりに定数「サイズ」が使用されています。そのため、警告はこのタイプの問題を強調表示します。
ただし、パラメーターを使用するためにインデントしたことがない場合は、メソッドシグネチャから削除するだけです。仮想メソッドまたは関数ポインターの署名を一致させる必要がない限り、その場合は削除するオプションはありません。
メソッドがパラメーターを使用しない場合、最初に生じる疑問は、そもそもそのパラメーターがメソッドのシグネチャの一部である理由です。これらの警告は、これらが参照しているのは悪い設計であり、さらに、このメソッドが呼び出されるたびにこのパラメーターがスタックにプッシュされるため、メソッドをリファクタリングして削除することがオーバーヘッドになるため、意味があります用途のないこのようなパラメータ。
とはいえ、これらのパラメーターを残しても、私が述べた少しのオーバーヘッドを除いて、大きな害はありません。