这个问题是前不久遗留下来的,现在已经解决了,就贴上来吧。
首先我们来看一段代码
int cbFxn(SOCKET s); // 在别处实现
BOOL udpTransferTask(SOCKET s, UINT32 unused)
{
//...省略
(void)unused; // 引用1:void
(void)cbFxn(s); // 引用2:void
//...省略
return TRUE;
}
注意udpTransferTask要求为BOOL Fx(SOCKET,UINT32)类型,
但是实际上udpTransferTask只需要提供一个SOCKET类型参数,
为了匹配Fx的形式才配置了一个无用的unused参数。
在上述引用1和引用2使用到了void关键字,初看起来这两个void是没什么用的。
事实上,引用1这条语句纯粹是多余的,引用2表示取消cbFxn的返回值,也是没什么用。
但是为何会在一些官方示例代码中看到这个呢?
这种代码就像是“脱裤子放屁”,不过仔细想一想,人家这么干一定是有原因的。
通过查阅一些资料我发现,有一个比较合理的解释:
这种情形下,void关键字并不是写给读者或者编译器看的,而是出于某种要求才设置的。
比如有时候需要对代码进行静态检查(比如检查返回值类型,检查是否存在未使用的变量等等),
在这种情况下,加上void关键字就能通过检查。
在引用1处,这条语句将避开这种错误:变量unused被声明却从未被使用
在引用2处,函数cbFxn有返回值,但是通过void转换,取消掉返回值,通过检查
综上,如果对代码要求十分严格(比如统一的风格,避开静态检查等等)就需要“多此一举”。
而一般情况下,无需这么做,去掉引用1那一条语句,去掉引用2的void转换,能够节省代码量,便于阅读。