24

COMブール値を使用する場合、wtypes.hでshortとして宣言されているVARIANT_BOOLとして渡されます。truefalseの事前定義された値もあります:

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

VARIANT_BOOLからC++bool型に変換するための最良の方法はどれですか?明らかなバリアントは次のとおりです。

  1. VARIANT_FALSEと比較してください

  2. 単にboolにキャストする

他の方法は簡単に考案できます。

これを行うための最良の方法はどれですか?最も読みやすく、標準に準拠し、偶発的なバグが発生しにくく、64ビットプラットフォームへの移植に関する問題が発生しにくいですか?

4

6 に答える 6

32

と比較してくださいVARIANT_FALSEtrueを期待する関数にC++ブール値(整数値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へのキャストは明らかに間違っています。VARIANT_FALSEと比較すると言う人もいますが(たとえば、BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. boolでのコメント)、私は両方と比較します。そうすれば、無効な値(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

グローバルヘッダーの1つでこのマクロを宣言します。

#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標準に従って、trueはtrueで、falseはfalseです。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 に答える