当使用COM时,布尔值将作为在wtypes.h中声明的VARIANT_BOOL传递。 还有预定义的真值和假值:
#define VARIANT_TRUE ((VARIANT_BOOL)-1) #define VARIANT_FALSE ((VARIANT_BOOL)0)
将VARIANT_BOOL转换为C ++ bool
types的最佳方法是什么? 明显的变体是:
与VARIANT_FALSE比较
简单地投给布尔
其他方式可以很容易地发明。
哪种方法是最好的 – 最可读性,最符合标准的兼容性,最不容易受到错误植入的问题,而且最不容易出现移植到64位平台的问题。
比较VARIANT_FALSE
。 在那里有很多错误的代码错误地将C ++ bool true
值(转换为整数值1)传递给期望VARIANT_BOOL
的函数。 如果你比较VARIANT_FALSE
,你仍然会得到正确的期望值。
我不喜欢担心不同的布尔值之间的兼容性,所以我通常会写:
VARIANT_BOOL vb_bool = VARIANT_FALSE; // ... vb_bool set to something by some other code bool myBool = (vb_bool == VARIANT_TRUE);
有更小的(如“将编译为更简单的x86代码”),有效的方法来做到这一点? 当然。 不值得。 这是保证工作,所以我可以担心我的业务逻辑。
铸造到布尔显然是错误的。 有人说(比如BOOL对比VARIANT_BOOL和BOOLEAN对布尔的评论) 与VARIANT_FALSE比较,但是我会比较两者。 这样你就可以尽早地捕获无效值(除VARIANT_FALSE或VARIANT_TRUE之外的任何值)。
例如
bool VariantBoolToBool(VARIANT_BOOL varFlag) { bool boolFlag; switch( varFlag ) { case VARIANT_TRUE: boolFlag = true; break; case VARIANT_FALSE: boolFlag = false; break; default: throw Exception("Not a valid value"); } return boolFlag; }
为什么要有明确的演员?
if (my_bool) { blargh(); } else { blarglerr(); }
按照C标准,这是真的,假的是假的。 如果你需要设置一个C ++风格的bool
然后做一些事情:
VARIANT_BOOL vb_bool = VARIANT_FALSE bool cpp_bool = !!vb_bool
在你的一个全局头文件中声明这个宏。
#define b(X) ((X)!=VARIANT_FALSE)
编辑:更安全的版本:
inline bool b(VARIANT_BOOL v){return v!=VARIANT_FALSE;}
标准的C ++转换规则依赖于零意义的错误[而且正如1800信息所指出的那样,TRUE变体是最容易发生混淆的地方],仅此而已。 因此,static_cast将是最好的。
但是在很多情况下,代码会比较可读性更好。 在这种情况下,VARIANT_BOOL是比较的东西。