web-dev-qa-db-ja.com

未使用の関数パラメーター値をvoidにキャストする理由

いくつかの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つのキャストは目的を果たしますか?

91
bastibe

一部のパラメーターは使用されないため、コンパイラーからの警告を避けるためにあります。

82
Benoit Thiery

プロトタイプに未使用パラメーターがある理由は、通常、関数が何らかの外部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はanother警告を生成します。

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

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

_abort;
_

おそらく何かをするために、代わりにabort();と書かれているはずです。

そして、それが_(void)_キャストの出番です-コンパイラーに、ステートメントがまったく効果を持たないことになっていることを明確かつ明示的に伝えます。

10
Antti Haapala