| 存儲類別 | 未顯式初始化值 | 存儲區 | 生命週期 |
|---|---|---|---|
| 局部變量(auto) | 不定值(棧垃圾) | 棧 | 函數調用期間 |
| 全局/靜態變量 | 0(編譯器保證) | BSS/數據段 | 程序全周期 |
誤區:局部變量「通常輸出 0」僅是巧合(棧內存恰好為 0),絕不可依賴,必須顯式初始化。
// 錯誤寫法
#define SQUARE(x) x * x
// SQUARE(3+2) → 3+2*3+2 = 11 (預期 25)
// 正確寫法:參數加括號、整體加括號
#define SQUARE(x) ((x) * (x))
// SQUARE(3+2) → ((3+2) * (3+2)) = 25
原則:宏展開是**標記級文本替換**,無類型檢查、無運算符優先級感知,必須用括號強制結合順序。
#define MY_STRING char*
MY_STRING name1, name2; // 展開為:char* name1, name2;
// 實際:name1 是 char*,name2 是 char(非指針!)
根因:`#define` 純文本替換,`char* name1, name2` 中 `*` 僅修飾 `name1`。
解決:使用 `typedef`:
typedef char* MY_STRING; // 類型別名,具備封裝性
MY_STRING name1, name2; // 正確:均為 char*
| 維度 | 宏 | 函數 |
|---|---|---|
| 調用開銷 | 零(預處理展開,就地執行) | 有(壓棧、跳轉、返回) |
| 類型安全 | 無 | 強類型檢查 |
| 調試可見性 | 差(源碼行號混亂) | 好 |
| 代碼體積 | 膨脹(多處展開) | 固定 |
| 適用場景 | 極簡、高頻、類型無關操作 | 複雜邏輯、需類型安全、可維護性優先 |
現代編譯器優化極強,`inline` 函數常能達到宏同等性能且保留類型安全,**優先考慮 `static inline` 函數**。