語法規則(強制,編譯器檢查)
- 字符集:僅允許字母 (A-Z, a-z)、數字 (0-9)、下劃線 (_)
- 首字符限制:必須是字母或下劃線,**不能是數字**
- 大小寫敏感:
count、Count、COUNT 是三個不同標識符
- 長度限制:C99 保證前 63 字符有效,實際編譯器通常支持更長
- 不能是關鍵字/保留字:
int、if、while 等不可作標識符
命名風格約定(行業通用,非強制但極其重要)
| 類型 | 風格 | 示例 | 適用場景 |
| 變量/函數 | snake_case | user_count, calculate_total() | C標準庫風格、Linux內核、嵌入式 |
| 常量/宏 | UPPER_SNAKE_CASE | MAX_BUFFER_SIZE, PI | 預處理宏、枚舉常量、配置參數 |
| 類型/結構體 | PascalCase 或 _t 後綴 | Node, UserInfo_t | 結構體標籤、typedef類型名 |
| 全局變量 | g_ 前綴 + snake_case | g_system_config | 標識作用域,減少誤用 |
| 靜態變量 | s_ 前綴 + snake_case | s_init_flag | 文件級/函數級靜態變量 |
| 指針變量 | p_ 前綴 或 _ptr 後綴 | p_head, node_ptr | 明確指針語義 |
專業命名原則
「變量名 = 屬性 + 類型 + 對象描述」
- 見名知義:
user_age 優於 a、ua、temp
- 避免縮寫:除非領域通用縮寫 (如
url, id, cpu)
- 布爾值前綴:
is_, has_, can_, should_ (如 is_valid)
- 循環計數器:
i, j, k 僅限極小作用域內部
- 單位後綴:
timeout_ms, buffer_size_kb, angle_rad
特殊規則與避坑
| 規則 | 說明 | 建議 |
| 下劃線開頭 | _name、__name 保留給編譯器/標準庫實現 | 業務代碼**絕不**以下劃線開頭 |
| 雙下劃線 | __anything 任何位置雙下劃線均保留 | 完全避免使用 |
| 大寫開頭+大寫 | NAME 類宏定義風格 | 僅用於宏/常量 |
| 標準庫保留 | str, mem, wcs, is, to 等前綴 | 自定義函數避免這些前綴 |
實戰對比:好 vs 坏
// ❌ 反面教材
int a, b, c, d; // 無意義
int userAge; // 混合大小寫不統一
int _temp; // 以下劃線開頭
int data1, data2; // 數字尾綴區分語義
#define max 100 // 宏用小寫,極易衝突
// ✅ 正範
int user_age; // snake_case
int max_retry_count; // 語義清晰
const double PI = 3.14159; // 常量大寫
#define MAX_BUFFER_SIZE 1024 // 宏大寫+前綴
typedef struct { ... } UserInfo_t; // 類型_t後綴
static int s_init_flag = 0; // 靜態變量s_前綴
自動化檢查工具
- 編譯器警告:
-Wall -Wextra -pedantic (GCC/Clang)
- 靜態分析:Cppcheck、Clang Static Analyzer、Coverity
- 代碼風格:clang-format (配置 .clang-format)、uncrustify
- 項目規範:Linux Kernel Coding Style、Google C++ Style Guide (C部分)、MISRA C (嵌入式/安全關鍵)
給初學者的建議
- 從第一行代碼開始強迫自己使用規範命名
- 閱讀優秀開源項目 (如 Redis、Nginx、Linux 內核) 學習命名藝術
- 配置編輯器自動格式化,統一團隊風格
- Code Review 時重點檢查命名質量
- 記住:**代碼是給人看的,順便能在機器上運行**