豚吐露@wiki

C4800が出る

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可

C4800が出る

Windows XP SP3
Visual Studio 2008
Visual C++ 2008

C4800はbool型へBOOL型の変数を代入しようとした時に発生する問題。

e.g.)こんなコトするからC4800が出る
BOOL B = TRUE;
bool b = B;

これはVCに存在するbool型とBOOL型が全く別物にも関わらず似たような使い方をされているので、たまに両者を同一視して扱っちゃうおバカさんが居て、代入しちゃう事が原因。
ちなみに、
bool b = true;
BOOL B = b;
ではC4800が起きないみたい。(´・ω・`)意味ワカラナス

BOOLとboolの違いは以下の通り。

BOOL 『typedef int BOOL』で定義されている。実際は整数型。
TRUE 『#define TRUE 1』で定義されている。実際は1という整数。
FALSE 『#define FALSE 0』で定義されている。実際は0という整数。

bool C99/C++で定義された論理型。
true 論理型の変数で使える真値。
false 論理型の変数で使える偽値。

BOOLは、論理型の無いC時代に論理型が使いたいって時に良くやってた方法。
boolは、C#やJavaのような最近の言語よろしくちゃんと論理型として定義された組み込み型。

要は全く別物なんだけど、大文字小文字の差だけなんで同一視しちゃうヤツが居てBOOLからboolへ代入するヤツが居る。一応、暗黙のキャストが行われるんだけど、当然warningが発生する。
ちなみに、明示的にキャストしてもこのwarningは消えません。

じゃ解決方法は?というと、bool型にして代入すれば良い。

e.g.)2回論理否定する
BOOL B = TRUE;
bool b = !!B;
2回論理否定すれば、当然元の値です。

e.g.)比較演算子を使う
BOOL B = TRUE;
bool b = FALSE != B;
上のが分かり難いって時は...まぁ、これも分かり難いけど...

e.g.)比較演算子を使う②
BOOL B = TRUE;
bool b = 0 < B;
これも分かり難い?

とか、色々方法はあると思うが、比較演算子などを使うことによって整数型から論理型に変えてやれば良い。

まぁ、でももっと悪いのはmicrosoftが...
BOOL B = false;
bool b = TRUE;
if(TRUE == b)
とかしとってもwarning出さん事。ホントに意味が分からない...orz

※C99以降であれば、『#include stdbool.h』とすることでC言語でもbool型が使える。そうするとC++との親和性が高くなる。らしい。



更新日: 2012年04月11日 (水) 12時00分09秒

名前:
コメント:

すべてのコメントを見る
記事メニュー
ウィキ募集バナー