歷史演進
- K&R C / C89:無布爾類型,約定
0 = false,非0 = true,常用 int 或 char 代替。
- 自定義方案:
typedef int bool;
#define TRUE 1
#define FALSE 0
// 或節省空間
typedef char bool;
- C99 標準:引入
_Bool 關鍵字(原生 1 字節布爾類型)及頭文件 <stdbool.h>,定義 bool、true、false 宏,與 C++ bool 互操作。
stdbool.h 核心內容
#ifndef _STDBOOL_H
#define _STDBOOL_H
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
#else
#define _Bool bool
#define bool bool
#define false false
#define true true
#endif
#define __bool_true_false_are_defined 1
#endif
_Bool 佔 1 字節,賦值非零自動歸一為 1。
- C++ 下宏映射為原生關鍵字,保證頭文件雙語言通用。
驗證實驗
#include
#include
int main() {
bool b1 = 10; // 非零 → true (1)
bool b2 = 0; // 零 → false (0)
printf("%d %d\n", b1, b2); // 輸出 1 0
printf("sizeof(bool)=%zu\n", sizeof(bool)); // 1
return 0;
}
浮點/整型轉換陷阱
bool b = 0.1f; → true (非零)。
bool b = 50000; (賦值給 short 後再轉) → 實際值可能截斷,但只要結果非零即 true。
最佳實踐建議
- 新代碼強制使用
#include + bool/true/false。
- 避免自定義
TRUE/FALSE 宏,污染命名空間且不標準。
- API 設計中,返回類型用
bool 表達成功/失敗,錯誤碼用輸出參數或單獨 errno。
- 嵌入式極度受限環境(如 8 位 MCU)確認編譯器支援
_Bool 後再用,否則沿用 uint8_t。
編譯器支援情況
- GCC ≥ 3.0、Clang、MSVC ≥ 2013 (C99 部分支援)、ICC 均完整支援。
- 頭文件路徑通常在
/usr/lib/gcc/.../include/stdbool.h 或編譯器內建。