未使用の関数パラメーター値をvoidにキャストするのはなぜですか?


98

一部のCプロジェクトでは、次のコードを確認しました。

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
    (void)ud;
    (void)osize;
    /* some code not using `ud` or `osize` */
    return ptr;
}

無効にする2つのキャストは、何かの目的を果たしますか?


正しい答え(未使用のパラメータに関するコンパイラの警告を禁止する)がチャールズのリンクされた質問にあるため、投票を終了します。
TEDの2010年

@Cody Grey-そのため閉鎖されました。しかし、実際にはその質問の重複ではありませんでした。689677は、パラメーターではなくvoidへのリターンのキャストについて話していました。
TEDの2010年

19
実際、両方の重複はこの質問には無効です。1つはC ++で、もう1つは戻り値に関するものです。これらは同じものではありません。Cパラメータの重複はありますか?
マットジョイナー、2011年

2
これは、提案された重複の対象とは異なる質問です。しかし、なぜ間違いがあったのかはわかります。(明らかに)再開されました。
Tim Post

4
注意:C ++ (void)が多少異なる効果を発揮するため、これをC ++質問の複製として閉じないでください。この質問は、C
Antti Haapala

回答:


89

一部のパラメーターは未使用であるため、コンパイラーからの警告を回避するためにあります。


3
:警告抑制するための最良の方法は何ですかstackoverflow.com/questions/3417837/...
チロSantilli郝海东冠状病六四事件法轮功

@Benoit voidへのキャストは実際には何をしますか?意図的に何かを無視している、または実際に何かをしている(無効)ことをコンパイラーに示す唯一の機能ですか?コンパイラーがそれを見ると、変数で何かを実行したと数え、警告を発行しませんか?
Tan Wang

2
@TanWangその唯一の機能は、意図的に何かを無視していることをコンパイラに示すことです。実行時には何もしません。
zwol 2016

14

プロトタイプに未使用のパラメーターがある理由は、通常、関数がいくつかの外部APIに準拠する必要があるためです。おそらくそれはライブラリー関数であるか、その関数へのポインターが、この呼び出し規約を想定している別の関数に渡されています。ただし、呼び出し規約で使用されるすべての引数が関数自体に実際に必要なわけではありません。

理由言及ボディにパラメータ名は以下のような警告を回避することです

unused.c: In function l_alloc’:
unused.c:3:22: warning: unused parameter ud [-Wunused-parameter]
 void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
                      ^~

この警告は、関数本体で実際のパラメーターを使用すると抑制できます。たとえば、次のステートメントがあるとします。

ud;

この警告は抑制されました。しかし今、GCCは別の警告を生成ます:

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~

この警告は、ステートメントud;は構文的には有効なCであるが、何も影響を与えず、ステートメントとは異なり間違いではない可能性があることを示しています。

abort;

これはおそらく、abort();何かを実行する代わりに作成されているはずです。

そして、(void)それがキャストの出番です。これは、ステートメントがまったく影響を及ぼさないことになっていることをコンパイラに明確かつ明示的に通知します。

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