C語言標識符命名規則 (C99/C11 標準)
- 字符集:僅允許字母 (a-z, A-Z)、數字 (0-9)、下劃線 (_)。嚴禁:空格、@ # $ % ^ & * ( ) - + = [ ] { } | \ ; : ' " , . < > / ? ` ~ 等特殊符號。
- 首字符限制:必須是字母或下劃線 (_),不能以數字開頭。
- 大小寫敏感:
var、Var、VAR 是三個不同標識符。
- 長度無標準限制:編譯器實現定義 (通常 ≥ 63 字符有效),建議見名知意、長度適中。
- 關鍵字/保留字不可用:32 個關鍵字 + 保留標識符 (雙下劃線開頭、下劃線+大寫字母開頭、標準庫保留名)。
經典考題逐項分析
| 選項 | 合法性 | 詳細原因 |
A. register | ❌ 非法 | C 語言關鍵字 (存儲類別說明符),不可作變量名 |
B. _10days | ✅ 合法 | 以下劃線開頭,後接數字字母,符合所有規則 |
C. my_book | ✅ 合法 | 字母開頭,含下劃線連接單詞,經典蛇形命名 |
D. us$ | ❌ 非法 | 包含特殊字符 $,不在允許字符集內 |
E. count | ✅ 合法 | 全小寫字母,簡潔明確,非關鍵字 |
關鍵字完整列表 (C11 標準 44 個)
auto break case char const continue default do
double else enum extern float for goto if
inline int long register restrict return short signed
sizeof static struct switch typedef union unsigned void
volatile while _Alignas _Alignof _Atomic _Bool _Complex _Generic
_Imaginary _Noreturn _Static_assert _Thread_local
注意:register 雖在 C11 中被棄用 (保留關鍵字),但仍不可作標識符使用。
保留標識符規則 (避免與標準庫/編譯器內部衝突)
- 雙下劃線開頭:
__foo, _Bar → 編譯器/標準庫內部使用
- 下劃線 + 大寫字母開頭:
_Foo, _MAX → 標準庫宏/函數保留
- 標準庫已定義名稱:
malloc, printf, errno, FILE 等 → 即使未包含頭文件也不可復用
命名最佳實踐 (業界通用風格指南)
| 類型 | 風格 | 示例 | 適用場景 |
| 局部變量/參數 | snake_case | user_count, max_size | C 語言標準庫風格、Linux 內核風格 |
| 全局變量 | g_snake_case | g_total_users | 前綴 g_ 區分作用域 |
| 常量/宏 | UPPER_SNAKE | MAX_BUFFER_SIZE, PI | 宏定義、enum 常量 |
| 函數 | snake_case | calculate_sum() | 動詞開頭,見名知意 |
| 結構體/類型 | PascalCase / _t 後綴 | UserInfo, user_info_t | POSIX 風格用 _t,項目統一即可 |
| 指針變量 | p_ 前綴或 _ptr 後綴 | p_head, node_ptr | 明確語義,防止解引用錯誤 |
常見新手錯誤案例
// ❌ 錯誤示例
int 2var = 10; // 數字開頭
int my-var = 20; // 含連字符 (被識別為減法)
int switch = 30; // 關鍵字
int _ = 40; // 單下劃線 (合法但語義不明,C++ 保留)
int __internal = 50; // 雙下劃線開頭 (保留給編譯器)
// ✅ 正確示例
int var2 = 10;
int my_var = 20;
int mySwitch = 30; // 或 my_switch
int _private = 40; // 單下劃線開頭合法,慎用
int internal_var = 50;
編譯器檢查技巧
- GCC/Clang:
-Wall -Wextra -pedantic -std=c11 開啟嚴格檢查
- 靜態分析:
cppcheck, clang-tidy, Coverity 可檢測命名規範違規
- 編碼規範工具:配合
.clang-format、uncrustify 統一風格
總結
合法變量名 = 字母/下劃線開頭 + 字母數字下劃線組成 + 非關鍵字/保留字。考題中 _10days、my_book、count 合法;register (關鍵字)、us$ (含 $) 非法。實際開發中遵循項目統一命名規範,善用靜態分析工具,從源頭杜絕命名衝突與可讀性問題。
- 上一篇文章: C語言術語辨析:對分查找就是二分查找,無異議
- 下一篇文章: C語言學習時間規劃:半年打牢基礎的科學節奏
Copyright ©
程式碼之家 All Rights Reserved