C 語言

儲存期(static、extern、automatic)

每個變數的儲存都存在一段時間,C 給你幾個關鍵字來選擇這段時間以及幾個相關性質。可以把它想成決定一個值的記憶體的租期:只租一通電話的時間(自動),或保留整個程式生命期的租約(靜態)。關鍵字 static、extern,以及預設的自動情況,控制了這件事。

自動儲存是區塊內宣告變數的預設:它們的儲存在控制流進入區塊時配置(通常在呼叫堆疊上),離開時釋放,所以每次呼叫都得到一份全新的副本。static 給予靜態儲存期:該變數在整個程式執行期間都存在,並在多次進入之間保留它的值;寫在函式內它是一個只在那裡可見、但持續存在的計數器,寫在檔案範圍它「還」會把可見性限制在那單一檔案(內部連結)。extern 在性質上不同——它不建立儲存,而是宣告某個具外部連結的變數(或函式)定義在另一個編譯單元,讓不同檔案共用同一個物件。另外還有 register,一個現已過時、提示把變數保留在 CPU 暫存器中的關鍵字。

為什麼重要:這些關鍵字是你控制資料活多久、以及哪些檔案能看到它的方式。一個常見的困惑來源是:單一個字 static 依情境做兩件不相關的事——在函式內是「活整個程式」,在檔案範圍是「只在這個檔案可見」。知道你正在召喚哪一個,是把多檔案程式組織乾淨的關鍵。

/* 檔案 a.c */ int shared = 0; /* 外部:其他檔案看得到 */ static int hidden = 0; /* 檔案範圍:只有 a.c 看得到 */ void f(void) { int once; /* 自動:每次呼叫都是新的 */ static int total = 0; /* 跨呼叫持續 */ } /* 檔案 b.c */ extern int shared; /* 宣告 a.c 的 shared 以便使用 */

檔案範圍的 static 隱藏一個名字;函式內的 static 讓它持續。b.c 裡的 extern 借用 a.c 的變數,而非建立一個新的。

關鍵字 static 依情境意思不同:在函式內是「活整個程式」,但在檔案範圍是「只在這個檔案可見」(內部連結)。extern 是宣告而非定義——它從不配置儲存空間。

又称
storage classlifetime of a variable儲存類別生存期