为了绕过静态检查而设置的void关键字

这个问题是前不久遗留下来的,现在已经解决了,就贴上来吧。


首先我们来看一段代码

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的返回值,也是没什么用。


扫描二维码关注公众号,回复: 3827158 查看本文章

但是为何会在一些官方示例代码中看到这个呢?

这种代码就像是“脱裤子放屁”,不过仔细想一想,人家这么干一定是有原因的。


通过查阅一些资料我发现,有一个比较合理的解释:

这种情形下,void关键字并不是写给读者或者编译器看的,而是出于某种要求才设置的。

比如有时候需要对代码进行静态检查(比如检查返回值类型,检查是否存在未使用的变量等等),

在这种情况下,加上void关键字就能通过检查。

在引用1处,这条语句将避开这种错误:变量unused被声明却从未被使用

在引用2处,函数cbFxn有返回值,但是通过void转换,取消掉返回值,通过检查


综上,如果对代码要求十分严格(比如统一的风格,避开静态检查等等)就需要“多此一举”。

而一般情况下,无需这么做,去掉引用1那一条语句,去掉引用2的void转换,能够节省代码量,便于阅读。



猜你喜欢

转载自blog.csdn.net/von_Ryan_Hack/article/details/43833815