8

-Wunused-parameter フラグを使用すると、コンパイラの最適化として、未使用のパラメーターに __unused を適用できます。次のコードでは、2 つの警告が発生します。

#include <stdio.h>
int main(int argc, char **argv) {
  printf("hello world\n");
  return 0;
}

これらの警告は、未使用の引数に __unused を追加することで修正されます。

#include <stdio.h>
int main(int __unused argc, char __unused **argv) {
  printf("hello world\n");
  return 0;
}

__unused とマークされたパラメーターを使用すると、clang 4.1 は警告もエラーも発生しません。

#include <stdio.h>
int main(int __unused argc, char __unused **argv) {
  printf("hello world. there are %d args\n", argc);
  return 0;
}

を使用しても同じ動作を示し__attribute__((unused))ます。

int main(int __attribute__((unused)) argc, char __attribute__((unused)) **argv) {

__unused で警告またはエラーを出す方法はありますか? used パラメーターに __unused を誤って残した場合、どうなりますか? 上記の例argcでは、コンパイラがヒントを利用していない可能性がありますが、正しい値を持っているように見えます。さらに理解しないと、この動作に依存しません。

4

2 に答える 2

12

この__unused属性は、関数/メソッドまたは関数/メソッドへの引数が使用されていない場合の苦情を防ぐためのものであり、それらの使用の欠如を強制するためのものではありません。

GCC マニュアルで使用される用語は次のとおりです。

関数に付加されたこの属性は、その関数が使用されない可能性があることを意味します

そして変数の場合

変数に付加されるこの属性は、変数が使用されない可能性があることを意味します。

最も一般的な用途は、インターフェイスに対する開発です。たとえば、コールバックなど、いくつかのパラメーターを受け入れるように強制される場合がありますが、それらすべてを使用するわけではありません。

テスト駆動開発を行うときに少し使用します。最初のルーチンはいくつかのパラメーターを受け取り、何もしないため、すべてのパラメーターが__attribute__((unused)). 私がそれを開発するとき、私はパラメータを利用します。開発の最後に、メソッドからそれらを削除し、何が揺れるかを確認します。

于 2013-01-25T00:35:17.390 に答える
3

この猫をスキンする別の方法は、パラメーターの名前を削除 (またはコメントアウト) することです。

int main ( int argc, char ** /* argv */ ) {
    printf("hello world. there are %d args\n", argc);
    return 0;
}

argvこれで、コンパイラは未使用であることを警告しなくなり、名前がないため使用できなくなりました。

于 2013-01-28T22:03:26.467 に答える