while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) // warning C4800
{
// ...
}
警告信息:warning C4800: “BOOL”: 將值強制為布爾值“true”或“false”(性能警告)
GetMessage 返回類型是 **`BOOL`** (Windows SDK 定義:`typedef int BOOL;`)。
BOOL bRet; // 而非 bool bRet;
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { ... }
原則:調用 Windows API 返回 BOOL 的函數,接收變量就用 BOOL。API 契約保證返回非零即真,零即假,無需轉換。
bool bRet;
while((bRet = (GetMessage(&msg, NULL, 0, 0) != 0))) { ... } // 先比較產生 bool 再賦值
// 或
while((bRet = GetMessage(&msg, NULL, 0, 0) ? true : false)) { ... }
#pragma warning(disable: 4800)
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { ... }
#pragma warning(default: 4800)
| 特性 | BOOL (Windows) | bool (C++) |
|---|---|---|
| 底層類型 | `int` (4 字節) | 內置類型 (1 字節) |
| 真值表示 | **任意非零值** (常為 1, -1, 句柄值...) | 僅 `true` (1) |
| 假值表示 | 0 | `false` (0) |
| 定義位置 | ` | C++ 標準關鍵字 |
| 典型 API | 所有 Win32 API 返回邏輯判斷 | C++ 標準庫、現代 C++ 代碼 |
修改 `bRet` 為 `BOOL` 後重新編譯,**警告 C4800 消失**,生成代碼更高效 (無額外轉換指令)。