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を渡したら、思いっきりハマっちまったぜ!ケラケラヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノケラケラ
そんなことがあるんですか (スコア:0)
そうでもないことがあるんですね.
非ゼロはすべて真値と扱ってくれれば良いのに...
Re:そんなことがあるんですか (スコア:2)
Re: (スコア:0)
VARIANT_TRUE は boolean の true とは別物だからね。
さらに windef.h で定義されているであろう TRUE もまた別物。
たとえ中身が同じであったとしても、この3つは違う型の違う値だと認識したほうが良いです。
コンテクストを混同したところからバグの作り込みが始まります。
Re:そんなことがあるんですか (スコア:2)
VARIANT_TRUE は boolean の true とは別物だからね。 さらに windef.h で定義されているであろう TRUE もまた別物。
たとえ中身が同じであったとしても、この3つは違う型の違う値だと認識したほうが良いです。 コンテクストを混同したところからバグの作り込みが始まります。
C++からCOMオブジェクトをいじることはあまりしていなかったので、自分の知識不足を再確認することとなりました。
まだまだ修行が足りないというか、本当に勉強になりました。:-)
Re: (スコア:0)
この理解が誤りの一歩じゃないかなぁ。
TRUE/FALSEはTRUE/FALSEであって、数値じゃないです。
たとえ、便宜上そういう値が入っているとしても。
Re:そんなことがあるんですか (スコア:2)
boolean型として型チェックをしてくれる訳でもなく、C++でCOMのプロパティに渡す場合はshort型として渡すことになるので、ちょっとした落とし穴でした。