| 屬性 | BOOL | bool |
|---|---|---|
| **本質型別** | `int`(`typedef int BOOL`) | C++ 內建基本型別 |
| **大小** | 4 位元組(32/64 位 Windows 均為 32-bit int) | 1 位元組 |
| **真值定義** | 非零即真(`TRUE` 定義為 1) | `true` (1) / `false` (0) 只有兩值 |
| **假值定義** | 零(`FALSE` 定義為 0) | `false` (0) |
| **來源** | Windows API (`windef.h`) | C++98 標準 (` |
| **適用場景** | Windows API 介面、舊代碼互操作 | 現代 C++ 邏輯判斷、標準庫 |
BOOL b1 = 1; // ✅ 正常
BOOL b2 = 3; // ✅ 正常(非零即真)
BOOL b3 = -1; // ✅ 正常
bool c1 = 1; // ✅ 正常(隱式轉 true)
bool c2 = 3; // ⚠️ 警告:非 0/1 值轉換(C++ 標準允許但編譯器提醒)
bool c3 = -1; // ⚠️ 警告:同上
// 函式回傳差異
BOOL winApiFunc() { return 5; } // 回傳 5,呼叫端 if(winApiFunc()) 為真
bool stdFunc() { return 5; } // 回傳 true (1),值被截斷為 1
BOOL check() { return 2; } // 非標準 TRUE,但非零
// 錯誤用法
if (check() == TRUE) // FALSE!2 != 1
printf("True\n");
else
printf("False\n"); // 執行這裡!
// 正確用法
if (check()) // 正確:非零即真
printf("True\n");
if (check() != FALSE) // 正確:非零即真
printf("True\n");
鐵律:**永遠不要將 `BOOL` 與 `TRUE`/`FALSE` 比較**,直接用 `if (bool_expr)` 或 `if (bool_expr != FALSE)`。
// 正確:直接使用 API 回傳
BOOL result = SomeWinApiFunction();
if (result) { ... } // 非零即成功
// 內部函式回傳 bool
bool isValid() { return value > 0; }
// 轉換邊界:BOOL → bool
BOOL apiResult = SomeApi();
bool internalFlag = (apiResult != FALSE); // 明確轉換
// 轉換邊界:bool → BOOL
bool internalCheck = true;
BOOL apiParam = internalCheck ? TRUE : FALSE; // 明確 1/0
struct WinApiStruct {
BOOL flag1; // 4 bytes
BOOL flag2; // 4 bytes
// 共 8 bytes
};
struct CppStruct {
bool flag1; // 1 byte
bool flag2; // 1 byte
// 可能僅 2 bytes(視對齊),節省記憶體
};
大量布林旗標時,`bool` 可顯著減少記憶體佔用;但與 Windows API 共享結構體時,**必須用 `BOOL` 保持二進位相容**。
#define FALSE 0
#define TRUE 1
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
理解這兩者的本質差異,能消除 Windows 程式開發中 90% 的布林邏輯 Bug。