C語言作用域四大類:文件、函數、代碼塊、原型作用域詳解
作用域決定標識符可見範圍。C 語言標準定義四種作用域,本文逐一解析並對比。
四種作用域對比表
| 作用域 | 適用對象 | 範圍 | 典型例子 |
| 文件作用域 | 所有代碼塊外聲明 | 從聲明處到文件結尾 | 全局變量、函數定義 |
| 函數作用域 | 語句標號 | 整個函數體內 | goto label; 標號 |
| 代碼塊作用域 | { } 內聲明 | 從聲明處到右大括號 | 局部變量、參數 |
| 原型作用域 | 函數原型參數名 | 僅在該原型聲明中 | void f(int x); 中的 x |
詳細解析
1. 代碼塊作用域
void func() {
int a = 1; // 代碼塊作用域開始
{ // 內層代碼塊
int b = 2; // 僅內層可見
printf("%d", a); // 可見外層 a
}
// printf("%d", b); // 錯誤:b 不可見
} // a 作用域結束
- 局部變量、參數屬於此類
- 內層可見外層,外層不可見內層
- 同名變量內層遮蔽外層
2. 文件作用域
int global = 10; // 文件作用域開始
void func1() { printf("%d", global); } // 可見
void func2() { global = 20; } // 可見
// 文件結尾作用域結束
- 全局變量、函數定義
- 同文件所有函數可見
- 跨文件需
extern 聲明
static 限制為內部鏈接
3. 原型作用域
void func(int x, int y); // x, y 僅在此行可見
void func(int a, int b) { // 實現中參數名可不同
// x, y 在此不可見
}
- 防止參數名與實現衝突
- 參數名可省略:
void func(int, int);
- 純編譯期概念,無運行時實體
4. 函數作用域
void func() {
goto label;
// ...
label: ; // 標號在整個函數可見
}
- 僅適用於
goto 標號
- 同函數內標號必須唯一
- 現代編程少用,了解即可
作用域 vs 生命周期
| 概念 | 作用域 | 生命周期 |
| 定義 | 標識符可見範圍 | 對象佔用內存時間 |
| 靜態局部變量 | 代碼塊 | 程序全期 |
| 全局變量 | 文件 | 程序全期 |
| 動態分配 | 無 (指針有作用域) | malloc 到 free |