static 是 C 語言中最具多重語意的關鍵字,依聲明位置不同,分別控制儲存期限、連結屬性、作用域可見性。本文系統梳理三大核心場景,配合記憶體模型圖解,消除常見誤解。
void counter() {
static int count = 0; // 僅初始化一次
count++;
printf("呼叫次數:%d\n", count);
}
靜態區: [count: 4 bytes] ← 程式全程固定地址 棧區: [臨時變數] ← 函數呼叫時動態增減 堆區: [malloc 區塊] ← 手動管理
// file1.c static int module_state = 0; // 僅 file1 可見 // file2.c static int module_state = 100; // 不衝突,獨立實體
static void helper() { ... } // 僅本檔可呼叫
同場景二,限制函數連結屬性為內部,實現封裝。
| 聲明位置 | 關鍵字 | 儲存期 | 連結性 | 作用域 | 典型用途 |
|---|---|---|---|---|---|
| 區塊內 | static | 靜態(程式全程) | 無連結 | 區塊內 | 狀態保持、單次初始化 |
| 檔案域(變數) | static | 靜態 | 內部連結 | 檔案內 | 模組私有資料、避免符號衝突 |
| 檔案域(函數) | static | 靜態 | 內部連結 | 檔案內 | 私有輔助函數、封裝實作細節 |
| 區塊內 | 無 (auto) | 自動(棧) | 無連結 | 區塊內 | 臨時計算變數 |
| 檔案域 | extern | 靜態 | 外部連結 | 全域 | 跨檔案共享變數/函數 |
static 變數「全域可見」static 僅檔案可見。static 會讓函數變「內聯」或「常駐記憶體」static 僅影響連結屬性,不影響代碼生成或執行邏輯。static 區域變數安全_Thread_local (C11) 實現執行緒區域儲存。static,最小化公開介面。static 區域變數,避免汙染全域命名空間。static 變數/函數(每個包含該頭檔的 .c 會產生獨立副本)。const 使用:static const int LIMIT = 100; 實現編譯期常量且不佔用符號表。精通 static 的三重語意,是編寫模組化、封裝良好、無符號衝突 C 專案的關鍵技能之一。