static 是 C 語言中極具特色的關鍵字,它對變數與函式的「生命周期」與「作用域」產生截然不同的影響。本文從基礎概念切入,配合程式碼實驗,徹底釐清 static 的兩大核心作用。
extern);區域變數僅限所在區塊。| 對象 | 生命周期 | 作用域 | 預設值 |
|---|---|---|---|
| 區域變數 | 延長為程式全期(靜態儲存區) | 不變(仍限於區塊內) | 自動初始化為 0 |
| 全域變數 | 不變(程式全期) | 縮限為當前檔案(內部連結) | 同樣為 0 |
| 函式 | 不變 | 縮限為當前檔案 | — |
void func() {
int local = 10; // 普通區域變數
static int s_local = 20; // static 區域變數
local++; s_local++;
printf("local=%d, s_local=%d\n", local, s_local);
}
int main() {
func(); // local=11, s_local=21
func(); // local=11, s_local=22 ← 保留上次值
func(); // local=11, s_local=23
}
輸出證明:s_local 只初始化一次,之後遞增;local 每次重置。
// file1.c
static int global_cnt = 0; // 僅 file1 可見
void inc() { global_cnt++; }
// file2.c
// int global_cnt; // 若無 static,會與 file1 衝突
// extern int global_cnt; // 會連結到 file1 的 global_cnt(若非 static)
加上 static 後,global_cnt 成為內部連結,其他檔案無法直接存取,有效避免大型專案中的符號衝突。
// utils.c
static void internal_helper() { ... } // 僅本檔可呼叫
void public_api() { internal_helper(); }
這是實現「資訊隱藏」的關鍵手段,配合 header 只對外宣告 public_api,達到模組化設計。
static 改變區域變數作用域 —— 不會,它只延長生命周期。static 區域變數,避免汙染全域命名空間。static 是 C 語言模組化編程的基石:
善用 static,能寫出更安全、可維護性更高的 C 程式碼。