奇怪的使用虚空

san*_*oyd 11 c void

我一直在浏览一些C源代码,并注意到以下内容:

void some_func (char *foo, struct bar *baz)
{
    (void)foo;
    (void)baz;
}
Run Code Online (Sandbox Code Playgroud)

为什么void在这里使用?我知道(void)在表达式明确指出该值被丢弃之前 ; 但有人可以解释一下这种用法的理由吗?

Eug*_*ith 22

此代码确保您不会收到有关foo和baz未使用的编译器警告.

  • 看起来使用编译器指令抛弃那些特定的警告似乎更好.听起来这两种解决方案都不是可移植的,所以你也可以做一个更好地记录你的意图的解决方案. (2认同)

blu*_*ucz 8

最有可能的是,某人正在使用编译器构建此代码,该编译器会针对未使用的参数发出警告,并希望禁止显示警告.


pax*_*blo 6

这些变量在函数中出现的最可能原因是删除有关未使用参数的任何警告.

但是,由于这可能会引入另一个警告(因为您可能使用高于正常的警告级别),作者还会采取额外步骤来删除这些警告级别.

在C中,声明

42;
Run Code Online (Sandbox Code Playgroud)

实际上是有效的,虽然不是很有用.如果您编译:

int main (void) {
    42;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它不会抱怨(通常).但是,如果你用gcc -Wall -pedantic(例如)编译它,你会得到类似的东西:

prog.c: In function `main':
prog.c:2: warning: statement with no effect
Run Code Online (Sandbox Code Playgroud)

因为正确的编译器认为你疯了.

(void)在生成值的某个东西之前放置一个强制转换,就像42;明确表示您不关心该值一样.

我已经看到这用于一些肛门保持编译器,它坚持认为,因为像printf实际返回一个值的函数,你必须因为忽略它而生气,导致如下暴行:

(void)printf ("Hello, world.\n");
(void)strcpy (dest, src);
Run Code Online (Sandbox Code Playgroud)

:-)


举例来说,如果你编译:

void some_func (char *foo) {}
int main (void) { some_func (0); return 0; }
Run Code Online (Sandbox Code Playgroud)

gcc -Wall -W -pedantic,你会得到:

warning: unused parameter `foo'
Run Code Online (Sandbox Code Playgroud)

如果您"使用"参数:

void some_func (char *foo) { foo; }
Run Code Online (Sandbox Code Playgroud)

你会得到

warning: statement with no effect
Run Code Online (Sandbox Code Playgroud)

但是,如果使用该参数并显式忽略结果:

void some_func (char *foo) { (void)foo; }
Run Code Online (Sandbox Code Playgroud)

你根本不会得到任何警告.