什麼是保留字?
保留字 = 關鍵字。它們是 C 語言語法的**核心構建塊**,編譯器賦予特定語意,用於構成陳述式、宣告、控制流、型別標記等。**使用者不可將其作為識別符(變數、函式、標籤、結構標籤、列舉常數、巨集名等)**。
C11/C17/C23 標準關鍵字完整表 (共 44/45/47 個)
| 分類 | 關鍵字 | 說明 |
| 資料型別 | int char float double void | 基本型別 |
short long signed unsigned | 修飾整數型別 |
_Bool (C99) / bool (<stdbool.h>) | 布林型別 |
_Complex _Imaginary (C99) | 複數型別 |
_Decimal32/64/128 (C23, 選擇性) | 十進制浮點數 |
| 分類 | 關鍵字 | 說明 |
| 儲存類別/鏈結屬性 | auto register static extern | 儲存期與鏈結性(C23 棄用 auto、register 語意) |
_Thread_local (C11) / thread_local (<threads.h>) | 執行緒區域儲存 |
_Atomic (C11) / atomic_* (<stdatomic.h>) | 原子型別/操作 |
inline (C99) | 內建函式提示 |
_Noreturn (C11) / noreturn (<stdnoreturn.h>) | 不返回函式標記 |
constexpr (C23) | 編譯期常數函式 |
| 分類 | 關鍵字 | 說明 |
| 控制流 | if else switch case default | 選擇結構 |
for while do | 迴圈結構 |
break continue goto return | 跳轉控制 |
| 分類 | 關鍵字 | 說明 |
| 結構/聯合/列舉/型別別名 | struct union enum typedef | 自訂型別 |
sizeof _Alignof (C11) / alignof (<stdalign.h>) | 大小/對齊查詢 |
_Alignas (C11) / alignas (<stdalign.h>) | 指定對齊 |
_Generic (C11) | 型別泛型選擇(編譯期多態) |
_Static_assert (C11) / static_assert (<assert.h>) | 編譯期斷言 |
| 分類 | 關鍵字 | 說明 |
| 其他 | restrict (C99) | 指標別名優化提示 |
volatile | 易變存取(硬體暫存器/訊號處理) |
goto 的標籤識別符非關鍵字,但受命名空間隔離 | |
為何不能作變數名?
int if = 1; // ❌ 編譯錯誤:'if' 是關鍵字
int While = 2; // ✅ 合法:大小寫敏感,'While' ≠ 'while'
int _Alignas = 3;// ❌ 以下劃線+大寫開頭保留給實作/標準庫
編譯器詞法分析階段就會將關鍵字辨識為特定 Token,若允許作識別符,語法分析將產生歧義(如 `if (if) if;` 無法判斷哪個是關鍵字哪個是變數)。
命名空間與保留識別符規則(進階)
- 雙下劃線開頭 (`__foo`, `_Foo`):**完全保留給編譯器/標準庫實作**,使用者程式碼不可定義。
- 單下劃線開頭 + 大寫字母 (`_Alignas`, `_Atomic`):**保留給標準庫擴展**,使用者不可定義。
- 單下劃線開頭 + 小寫/數字 (`_myvar`, `_123`):**檔案域/區塊域保留給使用者**,但全域命名空間建議避免,以免衝突未來標準。
- 標準庫巨集名 (`NULL`, `offsetof`, `VA_ARGS` 等) 及未來可能加入的關鍵字,皆屬保留識別符。
實用技巧
- **開啟嚴格標準模式編譯**:
gcc -std=c11 -pedantic -Wall -Wextra —— 會報錯所有保留識別符違規。
- **IDE/編輯器高亮**:VS Code (C/C++ Extension)、CLion、Visual Studio 會將關鍵字著色,直觀規避衝突。
- **命名慣例**:自訂識別符用 `snake_case` 或 `camelCase`,巨集用 `UPPER_SNAKE_CASE`,內部符號用 `_internal_name`,永不使用 `__` 開頭。
總結
保留字是語言的**骨架**,識別符是**血肉**。牢記 44+ 關鍵字、遵守保留識別符規範、開啟 `-pedantic`,是寫出可移植、標準相容、無驚喜 C 代碼的基礎防線。