豚吐露@wiki
C4800が出る
最終更新:
Bot(ページ名リンク)
-
view
C4800が出る
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は、C#やJavaのような最近の言語よろしくちゃんと論理型として定義された組み込み型。
要は全く別物なんだけど、大文字小文字の差だけなんで同一視しちゃうヤツが居てBOOLからboolへ代入するヤツが居る。一応、暗黙のキャストが行われるんだけど、当然warningが発生する。
ちなみに、明示的にキャストしてもこの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秒