我一直在浏览一些 C 源代码,我注意到以下内容:
void some_func (char *foo, struct bar *baz)
{
(void)foo;
(void)baz;
}
为什么void
在这里使用?我知道(void)
在一个表达式明确表示该值被丢弃之前;但有人可以向我解释这种用途的理由吗?
此代码可确保您不会收到有关 foo 和 baz 未使用的编译器警告。
最有可能的是,有人正在使用编译器构建此代码,该编译器会针对未使用的参数发出警告,并希望抑制警告。
这些变量出现在函数中的最可能原因是删除有关未使用参数的任何警告。
但是,由于这可能会引入另一个警告(因为您可能使用了高于正常警告级别的警告),所以作者还采取了额外的步骤来删除这些警告。
在 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; }
你根本不会收到任何警告。