奇怪的使用虚空

我一直在浏览一些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这样的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; } 

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