24

使用 COM 时,布尔值将作为 VARIANT_BOOL 传递,在 wtypes.h 中声明为shorttruefalse也有预定义的值:

#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)

从 VARIANT_BOOL 转换为 C++bool类型的最佳方法是什么?明显的变体是:

  1. 与 VARIANT_FALSE 比较

  2. 简单地转换为布尔

可以很容易地发明其他方法。

最好的方法是什么——最易读、最符合标准、最不容易出现意外错误植入以及最不容易出现移植到 64 位平台的问题?

4

6 回答 6

32

比较VARIANT_FALSE。有很多错误的代码错误地将 C++ booltrue值(强制转换为整数值 1)传递给期望VARIANT_BOOL. 如果你比较VARIANT_FALSE,你仍然会得到正确的期望值。

于 2009-05-20T08:16:57.523 回答
11

我不想担心不同布尔值之间的兼容性,所以我通常会写:

VARIANT_BOOL vb_bool = VARIANT_FALSE;

// ... vb_bool set to something by some other code

bool myBool = (vb_bool == VARIANT_TRUE);

是否有更小(如“将编译为更简单的 x86 代码”)的有效方法?当然。不值得。这保证有效,所以我可以担心我的业务逻辑。

于 2009-05-20T21:54:33.237 回答
4

转换为 bool 显然是错误的。有人说(例如BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool的评论)与 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;
}
于 2009-05-20T08:16:33.297 回答
2

在您的全局标题之一中声明此宏。

#define b(X) ((X)!=VARIANT_FALSE)


编辑:更安全的版本:

inline bool b(VARIANT_BOOL v){return v!=VARIANT_FALSE;}
于 2009-05-20T09:09:03.627 回答
1

为什么要有明确的演员表?

if (my_bool)
{
    blargh();
}
else
{
   blarglerr();
}

这样,根据 C 标准,真为真,假为假。如果您需要设置 C++ 样式bool,请执行以下操作:

VARIANT_BOOL vb_bool = VARIANT_FALSE
bool cpp_bool = !!vb_bool
于 2009-05-20T08:32:58.583 回答
0

标准 C++ 转换规则依赖于零表示 false [正如 1800 INFORMATION 指出的那样,TRUE 变体是最容易发生混淆的地方],仅此而已。因此,一个 static_cast 将是最好的。

但在许多情况下,作为比较,代码会更具可读性。在这种情况下,VARIANT_BOOL 是要比较的东西。

于 2009-05-20T08:23:31.817 回答