24

私はC++プロジェクトに取り組んでいますが、未使用のパラメーターについて多くの警告があることに気付きました。

これらの警告を無視すると、どのような影響がありますか?

4

8 に答える 8

63

未使用のパラメーターを持つ関数には、次の場合に実際のバグがある可能性があります。

  1. 割り当ても書き込みもされていない出力パラメーターがあり、呼び出し元の値が未定義になっています。

  2. パラメータの1つは、コールバック関数ポインタです。これを呼び出す必要があり、そうすることを忘れる必要があります。#ifdef関数にsがたくさんある場合に発生する可能性があります。

  3. パラメータをシャドウする同じ名前のローカル変数を宣言し、その後、関数で間違った値を使用します。

入力パラメーターを使用しないことは無害かもしれませんが、関数の先頭に未使用の入力パラメーターを明示的にマークすることで、ノイズを減らして有用な警告を表示できます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);
}
于 2008-11-21T09:49:15.387 に答える
14

__attribute__((unused))警告を無効にするgcc固有の方法については、次のように使用できます。

void foo(int a, int b __attribute__((unused))) {

}

2番目のパラメーターを無視します。プログラムがすでにGCCテクノロジーに依存している場合は、その属性を使用して、その種の警告から100%安全にすることができます。

于 2009-01-03T15:26:02.133 に答える
14

重要ではない重要でない警告がたくさんある場合は、それらの真ん中に隠れている、今書いたコード行に関する重要な警告を見落とす可能性があります。

于 2008-11-21T09:47:32.410 に答える
1

なし。[編集]を除く:他の人が指摘しているように、出力パラメータが割り当てられていない可能性があります。

多くの場合、開発者は多数の警告の中に「隠されている」重要な警告を無視し、警告を見るのに慣れていて、注意を払っていないので、それらをクリーンアップする必要があります。私は常に警告をゼロにし、コンパイラの警告を最大レベルに設定しようとしています。

于 2008-11-21T09:47:06.937 に答える
1

これは、パラメーターを受け取るがパラメーターを使用しない関数を作成したことを意味します。無害ですが、場合によってはバグを示している可能性があります。

通常、この警告を消すには、パラメーター名を削除して匿名のままにしますが、パラメーターが使用されていない理由によっては、これが望ましくない場合があります。

実際の問題を見つけるのが難しくなっている場合は、警告をオフにすることをお勧めします。

于 2008-11-21T09:47:45.187 に答える
1

それは、パラメーターを使用するつもりかどうかによって異なります。例えば

const int Size = 12; // intended for use in some other function

char* MakeBuffer(int size)
{
   return new char[Size];
}

このコードでは「サイズ」は使用されておらず、代わりに定数「サイズ」が使用されています。したがって、警告はこのタイプの問題を強調します。

ただし、パラメーターを使用するためにインデントしていない場合は、メソッド シグネチャから削除する必要があります。仮想メソッドまたは関数ポインターのシグネチャを一致させる必要がない限り、その場合はそれを削除するオプションはありません。

于 2008-11-21T10:02:32.757 に答える
1

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;
}

使用していないパラメーターがあり、それがデフォルト設定されていない場合は、参照されない余分な値をスタックに渡すようにプログラムに要求しているため、警告が表示されます。したがって、必要以上の作業が行われます。

たぶん、関数ロジックの一部も忘れてしまったということです。

于 2008-11-21T10:08:31.307 に答える
0

メソッドがパラメーターを使用しない場合、最初に発生する質問は、そもそもそのパラメーターがメソッドのシグネチャの一部である理由です。これらの警告は、これらが参照している設計が悪いため、意味があります。さらに、このメソッドが呼び出されるたびにこのパラメーターがスタックにプッシュされるため、メソッドをリファクタリングして削除するのが最善です。何の役にも立たないそのようなパラメータ。

そうは言っても、これらのパラメーターを残しても、私が言及したわずかなオーバーヘッドを除いて、それほど害はありません。

于 2008-11-21T09:49:51.237 に答える