首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言布爾類型演進:從自定義 int 到 C99 stdbool.h 標準用法

     編輯:關於C語言

歷史演進

  1. K&R C / C89:無布爾類型,約定 0 = false,非0 = true,常用 int 或 char 代替。
  2. 自定義方案:
    
    typedef int bool;
    #define TRUE 1
    #define FALSE 0
    // 或節省空間
    typedef char bool;
    
  3. 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。

最佳實踐建議

  1. 新代碼強制使用 #include + bool/true/false。
  2. 避免自定義 TRUE/FALSE 宏,污染命名空間且不標準。
  3. API 設計中,返回類型用 bool 表達成功/失敗,錯誤碼用輸出參數或單獨 errno。
  4. 嵌入式極度受限環境(如 8 位 MCU)確認編譯器支援 _Bool 後再用,否則沿用 uint8_t。

編譯器支援情況

  • GCC ≥ 3.0、Clang、MSVC ≥ 2013 (C99 部分支援)、ICC 均完整支援。
  • 頭文件路徑通常在 /usr/lib/gcc/.../include/stdbool.h 或編譯器內建。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved