存儲類定義了變量/函數的作用域(可見性)與生命週期。四大存儲類說明符置於類型之前。
所有塊內局部變量默認為 auto,僅在塊內可見,塊結束銷毀。auto int x; 與 int x; 等價,僅限函數內使用。
請求將變量存入 CPU 寄存器而非內存,適合頻繁訪問的計數器:
register int counter;
限制: 無法取地址(&counter 非法),大小受寄存器限制,編譯器可能忽略請求。
| 場景 | 效果 |
|---|---|
| 修飾局部變量 | 程序全生命週期存在,保持值跨函數調用,僅初始化一次 |
| 修飾全局變量 | 限制作用域於當前文件(內部鏈接),防止名稱衝突 |
| 修飾函數 | 同全局變量,僅本文件可見 |
經典示例:函數調用計數器
#include <stdio.h>
void func() {
static int count = 0; // 僅初始化一次
count++;
printf("調用次數: %d\n", count);
}
int main() {
func(); func(); func(); // 輸出 1, 2, 3
return 0;
}
聲明一個在其他文件定義的全局變量/函數,實現多文件共享:
/* file1.c */
int global_var = 10;
void write_extern() { printf("%d", global_var); }
/* file2.c */
extern int global_var; // 引用 file1 定義
extern void write_extern(); // 引用函數
int main() { write_extern(); }
編譯:gcc file1.c file2.c 生成可執行文件。
| 存儲類 | 作用域 | 生命週期 | 默認值 | 典型用途 |
|---|---|---|---|---|
| auto | 塊內 | 塊執行期間 | 垃圾值 | 普通局部變量 |
| register | 塊內 | 塊執行期間 | 垃圾值 | 熱點計數器 |
| static(局部) | 塊內 | 程序全期 | 0/NULL | 狀態保持 |
| static(全局) | 文件內 | 程序全期 | 0/NULL | 模組私有數據 |
| extern | 全局(多文件) | 程序全期 | 0/NULL | 跨文件共享 |