翻译《有关编程、重构及其他的终极问题?》——26.潜伏的VARIANT_BOOL

翻译《有关编程、重构及其他的终极问题?》——26.潜伏的VARIANT_BOOL

标签(空格分隔): 翻译 技术 C/C++
作者:Andrey Karpov
翻译者:顾笑群 - Rafael Gu
最后更新:2017年06月01日


26. 潜伏的VARIANT_BOOL

下面这段代码摘自NAME项目。PVS-Studio对这段危险的代码诊断如下: V721 The VARIANT_BOOL type is utilized incorrectly. The true value (VARIANT_TRUE) is defined as -1. Inspect the first argument(译者注:大意是VARIANT_BOOL类型被错误的使用了,因为VARIANT_TRUE的实际定义值位-1,请检查第一个参数)。

virtual HRESULT __stdcall
  put_HandleKeyboard (VARIANT_BOOL pVal) = 0;
....
pController->put_HandleKeyboard(true);

解释
这里有句非常诙谐的名句:

“我们都陷于某种在易被影响的年纪学习基础的原罪”——P.J. Plauger

这句话非常适用于罪恶的话题。VARIANT_BOOL类型是Viusal Basic带给我们的。我们当前的一些编程麻烦和这个类型有关。关键的问题在于这种类型的“true”其值位-1.

让我们看看但这个类型的声明以及常量true/false的表达:

typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)

看上去着没有什么糟糕的,False为0, 而Ture不是0。所以看上去-1是一个非常合适的常量。但这在使用true或者TRUE时而非VARIANT_TRUE时容易导致错误。

正确的代码

pController->put_HandleKeyboard(VARIANT_TRUE);

建议
假如你看到一个不认识的类型,最好不要慌,而是去查找相关的文档。甚至类型名为BOOL,这也不意味着你能把1放入到这个类型的变量里。

程序员们有时也会犯下类似的错误,比如在使用HRESULT类型时,尝试去和FALSE或TRUE去比较,但忘了:

#define S_OK     ((HRESULT)0L)
#define S_FALSE  ((HRESULT)1L)

所以我真的要求您在面对新类型时必须特别仔细,不要在编程时过于匆忙去下定义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值