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

本文探讨了在代码中使用void关键字绕过静态检查的情况。以一个示例代码说明了void如何消除未使用变量警告以及取消函数返回值。虽然在某些严格场景下这样做有助于遵循统一风格和通过静态检查,但在一般情况下,可以简化代码以提高可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


首先我们来看一段代码

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转换,能够节省代码量,便于阅读。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值