パスワードを忘れた? アカウント作成
150043 journal

A7Mの日記: 思い込み(・A・)イクナイ!! 6

日記 by A7M

そうか。TRUEとVARIANT_TRUEって、別の値だったんだ。
こんな感じのコードをVC++やBCC32に喰わせてみて初めて気がついた。

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
  printf("TRUE = %d\n", TRUE);
  printf("VARIANT_TRUE = %d\n", VARIANT_TRUE);
  return 0;
}

結果はTRUEが1で、VARIANT_TRUEが-1になる。
真偽値が必要なCOMオブジェクトのプロパティにTRUEを渡したら、思いっきりハマっちまったぜ!ケラケラヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノケラケラ

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2009年10月06日 14時53分 (#1649443)
    FALSE(0) と違うか否かで値の真偽を判断するのが C の習いだと思ってましたが,
    そうでもないことがあるんですね.
    非ゼロはすべて真値と扱ってくれれば良いのに...
    • 条件反射的にTRUEを渡していたので問題無いと思っていたら、挙動が違うので判明しました。
      親コメント
    • by Anonymous Coward

      VARIANT_TRUE は boolean の true とは別物だからね。
      さらに windef.h で定義されているであろう TRUE もまた別物。

      たとえ中身が同じであったとしても、この3つは違う型の違う値だと認識したほうが良いです。
      コンテクストを混同したところからバグの作り込みが始まります。

      • VARIANT_TRUE は boolean の true とは別物だからね。 さらに windef.h で定義されているであろう TRUE もまた別物。

        たとえ中身が同じであったとしても、この3つは違う型の違う値だと認識したほうが良いです。 コンテクストを混同したところからバグの作り込みが始まります。

        C++からCOMオブジェクトをいじることはあまりしていなかったので、自分の知識不足を再確認することとなりました。
        まだまだ修行が足りないというか、本当に勉強になりました。:-)

        親コメント
    • by Anonymous Coward
      >非ゼロはすべて真値と扱ってくれれば良いのに

      この理解が誤りの一歩じゃないかなぁ。
      TRUE/FALSEはTRUE/FALSEであって、数値じゃないです。
      たとえ、便宜上そういう値が入っているとしても。
typodupeerror

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

読み込み中...