儲存類定義 C 程式中變數/函式的範圍(可見性)和生命週期。這些說明符放置在它們所修飾的型別之前。下面列出 C 程式中可用的儲存類:
auto、register、static、extern
auto 儲存類
auto 儲存類是所有區域性變數預設的儲存類。
{ int mount; auto int month; }
上面的例項定義了兩個帶有相同儲存類的變數,auto 只能用在函式內,即 auto 只能修飾區域性變數。
register 儲存類
register 儲存類用於定義儲存在暫存器中而不是 RAM 中的區域性變數。這意味著變數的最大尺寸等於暫存器的大小(通常是一個詞),且不能對它應用一元的 `&` 運算子(因為它沒有記憶體位置)。
{ register int miles; }
暫存器只用於需要快速訪問的變數,比如計數器。還應注意的是,定義 `register` 並不意味著變數將被儲存在暫存器中,它意味著變數可能儲存在暫存器中,這取決於硬體和實現的限制。
static 儲存類
static 儲存類指示編譯器在程式的生命週期內保持區域性變數的存在,而不需要在每次它進入和離開作用域時進行建立和銷燬。因此,使用 static 修飾區域性變數可以在函式呼叫之間保持區域性變數的值。
static 修飾符也可以應用於全域性變數。當 static 修飾全域性變數時,會使變數的作用域限制在宣告它的檔案內。
static 是全域性變數的預設儲存類,以下兩個變數 (count 和 road) 都有一個 static 儲存類。
static int Count; int Road; main() { printf("%d ", Count); printf("%d ", Road); }
以下例項演示了 static 修飾全域性變數和區域性變數的應用:
#include <stdio.h> /* 函式宣告 */ void func1(void); static int count=10; /* 全域性變數 - static 是預設的 */ int main() { while (count--) { func1(); } return 0; } void func1(void) { /* `thingy` 是 `func1` 的區域性變數 - 只初始化一次 * 每次呼叫函式 `func1` `thingy` 值不會被重置。 */ static int thingy=5; thingy++; printf(" thingy 為 %d , count 為 %d ", thingy, count); }
例項中 count 作為全域性變數可以在函式內使用,thingy 使用 static 修飾後,不會再每次呼叫時重置。
可能您現在還無法理解這個例項,因為我已經使用了函式和全域性變數,這兩個概念目前為止還沒進行講解。即使您現在不能完全理解,也沒有關係,後續的章節我們會詳細講解。當上面的程式碼被編譯和執行時,它會產生下列結果:
thingy 為 6 , count 為 9 thingy 為 7 , count 為 8 thingy 為 8 , count 為 7 thingy 為 9 , count 為 6 thingy 為 10 , count 為 5 thingy 為 11 , count 為 4 thingy 為 12 , count 為 3 thingy 為 13 , count 為 2 thingy 為 14 , count 為 1 thingy 為 15 , count 為 0
extern 儲存類
extern 儲存類用於提供一個全域性變數的引用,全域性變數對所有的程式檔案都是可見的。當您使用 `extern` 時,對於無法初始化的變數,會把變數名指向一個之前定義過的儲存位置。
當您有多個檔案且定義了一個可以在其他檔案中使用的全域性變數或函式時,可以在其他檔案中使用 extern 來得到已定義的變數或函式的引用。可以這麼理解,extern 是用來在另一個檔案中宣告一個全域性變數或函式。
extern 修飾符通常用於當有兩個或多個檔案共享相同的全域性變數或函式的時候,如下所示:
第一個檔案:main.c
#include <stdio.h> int count ; extern void write_extern(); int main() { count = 5; write_extern(); }
第二個檔案:support.c
#include <stdio.h> extern int count; void write_extern(void) { printf("count is %d ", count); }
在這裡,第二個檔案中的 extern 關鍵字用於宣告已經在第一個檔案 main.c 中定義的 count。現在 ,編譯這兩個檔案,如下所示:
$ gcc main.c support.c
這會產生 a.out 可執行程式,當程式被執行時,它會產生下列結果:
count is 5