在 Windows 平台開發中,BOOL(大寫)與 bool(小寫)並存已久。許多開發者將它們視為同義詞,實則兩者在類型系統、記憶體佈局、取值規則上存在顯著差異。混用可能導致邏輯錯誤、序列化不一致、跨平台移植失敗等隱患。本文將從三大維度徹底釐清二者區別,並給出實戰建議。
| 特性 | BOOL | bool |
|---|---|---|
| 定義方式 | 微軟自定義巨集:typedef int BOOL; |
C++98 標準關鍵字(C99 起為 _Bool,stdbool.h 提供 bool 別名) |
| 類型性質 | 本質是 int(有號整數) | 獨立的布林類型,非整數 |
| 標頭檔 | <windows.h> / <wtypes.h> |
C++ 直接使用;C 需 #include <stdbool.h> |
int 大小。32 位環境佔 4 Bytes,64 位環境通常仍為 4 Bytes(視編譯器 sizeof(int) 而定)。結構體中會觸發 4 位元組對齊。sizeof(bool) == 1。佔 1 Byte,對齊要求為 1 位元組。結構體陣列中更緊湊,利於緩存局部性。實測示例(x64 MSVC):
struct S1 { BOOL b; }; // sizeof = 4
struct S2 { bool b; }; // sizeof = 1
struct S3 { BOOL b1; bool b2; }; // sizeof = 8 (對齊填充)
| 屬性 | BOOL | bool |
|---|---|---|
| 標準值 | TRUE (1), FALSE (0) |
true (1), false (0) |
| 合法取值 | 任意 int 值。非零視為真,零為假 | 僅 0 或 1。賦值非 0/1 會隱式轉換為 1(C++)或產生警告(C) |
| 邏輯運算 | BOOL x = 3; if (x == TRUE) → 假! (3 != 1) |
bool x = 3; if (x == true) → 真 (x 為 1) |
// BOOL 陷阱
BOOL flag = 3; // 編譯通過,值為 3
if (flag == TRUE) { ... } // FALSE!因為 TRUE 定義為 1
if (flag) { ... } // 正確:非零即真
// bool 行為
bool flag2 = 3; // C++ 隱式轉為 true (1);C 可能警告
if (flag2 == true) { ... } // 正確:flag2 實為 1
// 序列化/網路傳輸風險
struct Packet { BOOL ready; }; // 4 bytes,跨平台易出錯
struct Packet2 { bool ready; }; // 1 byte,但位序未標準化
BOOL 時,永遠用 if (flag) 判斷真假,切勿 == TRUE。bool。配合 static_cast<bool>(expr) 明確轉換。inline bool ToBool(BOOL v) { return v != FALSE; }
inline BOOL ToBOOL(bool v) { return v ? TRUE : FALSE; }
BOOL/bool。使用固定大小整數(uint8_t 0/1)並文檔化。bool 或顯式 #pragma pack 並文檔化大小。BOOL 是 Windows 歷史產物,本質是 int;bool 是現代 C/C++ 標準布林類型。二者不可隱式互換。新專案應堅持使用 bool,僅在呼叫 Windows API 邊界處做薄轉換層,從根源消除「3 == TRUE 為假」類邏輯 Bug。