我一直在浏览一些C源代码,并注意到以下内容:
void some_func (char *foo, struct bar *baz)
{
(void)foo;
(void)baz;
}
为什么void
在这里使用?在表达式明确指出值被丢弃之前,我知道(void)
;但有人可以解释一下这种用法的理由吗?
答案 0 :(得分:22)
此代码确保您不会收到有关foo和baz未使用的编译器警告。
答案 1 :(得分:8)
最有可能的是,某人正在使用编译器构建此代码,该编译器会针对未使用的参数发出警告,并希望禁止显示警告。
答案 2 :(得分: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; }
你根本不会收到任何警告。