11

私はいくつかのCソースコードを調べてきましたが、次のことに気付きました:

void some_func (char *foo, struct bar *baz)
{
    (void)foo;
    (void)baz;
}

なぜvoidここで使われるのですか?値が破棄(void)されることを式が明示的に示す前に、私は知っています。しかし、誰かがそのような使用の理論的根拠を説明してもらえますか?

4

3 に答える 3

22

このコードにより、foo と baz が使用されていないというコンパイラの警告が表示されなくなります。

于 2010-11-03T02:42:42.767 に答える
8

おそらく、未使用の引数に対して警告を発するコンパイラを使用してこのコードを作成した誰かが、警告を抑制したいと考えていた可能性があります。

于 2010-11-03T02:43:03.810 に答える
6

これらの変数が関数に表示される最も可能性の高い理由は、未使用の引数に関する警告を削除することです。

ただし、これによりさらに別の警告が発生する可能性が高いため (通常よりも高い警告レベルを使用している可能性が高いため)、作成者はそれらを削除するために追加の手順を実行します。

C では、ステートメント

42;

あまり役に立ちませんが、実際には有効です。コンパイルする場合:

int main (void) {
    42;
    return 0;
}

文句を言いません(通常)。ただし、gcc -Wall -pedantic(たとえば)でコンパイルすると、次のようになります。

prog.c: In function `main':
prog.c:2: warning: statement with no effect

コンパイラは、当然のことながら、あなたが気が狂ったと考えているからです。

(void)値を生成する何かの前にキャストを配置42;します。たとえば、値を気にしないことを明示的に示します。

printf関数のようなものは実際に値を返すため、それを無視することに腹を立て、次のような残虐行為につながると主張するいくつかの肛門保持型コンパイラでこれが使用されているのを見てきました。

(void)printf ("Hello, world.\n");
(void)strcpy (dest, src);

:-)


例として、コンパイルすると:

void some_func (char *foo) {}
int main (void) { some_func (0); return 0; }

を使用するとgcc -Wall -W -pedantic、次のようになります。

warning: unused parameter `foo'

パラメータを「使用」する場合:

void some_func (char *foo) { foo; }

あなたが得るでしょう

warning: statement with no effect

ただし、パラメーターを使用して結果を明示的に無視すると、次のようになります。

void some_func (char *foo) { (void)foo; }

警告はまったく表示されません。

于 2010-11-03T02:59:55.443 に答える