関数のパラメータとしてArduinoコンパイラの `__unused`とは何ですか?

私がArduino環境ではじめて私が気づいたのは、 File |設定|コンパイラ警告なしに設定したので、すべてに設定しました。そこで私はすぐに None に設定し直しました。

さて、「後で」は今のところ、コンパイラを静かにするためのコードを修正するための警告を開始しました。

Note that I don't want to disable any warnings - I want to placate the compiler at each spot so that it says to itself "No problem here!"

  • コンパイラが未使用の変数について不平を言うと、変数をコメントアウトします;
  • 符号付き/符号なしの比較で不平を言うと、タイプを変更します;
  • 関数内で未使用のパラメータがあると訴えると、私は...

...うーん。これがC ++の場合は、パラメータ名をコメントアウトして、裸の型を残しておきます。

void Fn(int /*param*/) {
}//Fn(param)

Arduinoのレポート:
     error:パラメータ名が省略されています

しかし、これはCでは合法ではありません。コンパイラによっては、 __ unused 属性を使うことができます:

void Fn(int __unused param) {
}//Fn(param)

Arduinoのレポート:
     error:予期しない ';'、 '、'または ')'の前に 'param'
    実際のパラメータ名として __ unused を解釈しています。

もし彼らが気難しいのであれば、

void Fn(int __attribute__((unused)) param) {
}//Fn(param)

Arduinoのレポート:
    警告:未使用のパラメータ 'param' [-Wunused-parameter]
    これは明らかに正しい __属性__ ではありません。

したがって、Arduino環境では上記のいずれも機能しません。提案?


私は20年以上にわたってCとC ++でプログラミングしてきましたが、あなたが常にやるべきことは、コンパイラにすべてのことについて通知するように依頼することです。あなたは常に警告なしのコンパイルが必要です!それ以外の場合は、バグを見つけようと数時間かかかります。コンパイラが警告していることを発見しただけです。

3
ArduinoコアはCとC ++の混合物です。 void f(int){...} イディオムはC ++ファイルで動作するはずです。コアが非常に多くの警告を発するのは残念だと私は同意する。
追加された 著者 Sprogz,

2 答え

まあ、私は掲示のためにすべての質問を入力し、最後にもう一度試しました。出来た!

void Fn(__attribute__((unused)) int param) {
}//Fn(param)

ですから、良い質問を無駄にするのではなく、答えはここにあります!

今私たちがする必要があるのは、すべての図書館の管理者にこれらを入れて、他の警告を修正することです。

2
追加された
Cでよく使われる別のイディオムは void f(int param){(void)param; ...}
追加された 著者 Sprogz,

関数の本体の中でこれを行うと、警告を抑制することができます:

void do_something(int value) {
  (void) (value);
  . . .
}

より明確にするために、マクロを使って同じことをすることができます:

#define UNUSED(v) (void) (v)

void do_something(int value) {
  UNUSED(value);
  . . .
}

これは、条件付きコンパイルがある場合に役立ちます。

void do_something(int value) {
  #ifndef USES_PARAM
    UNUSED(value);
  #else
    other_stuff(value);
  #endif
  . . .
}
1
追加された
私はほとんどのコンパイラがそれに「正しいこと」を行うことを知っていますが、「ロード」を出すものを見たことがあります。変数宣言を「装飾」するのは、コード生成部分ではなく、コンパイラに信号を送ることです。それは単に保証の可能性ではなく、可能性を示すものです。 unused というフラグが立っている変数を実際に使用すると、コンパイラはエラーにはなりません。したがって、最後の例では、 value をデコレートし、 #if [n] def
追加された 著者 makons,