作用域 = **標識符(變數/函式名)可見且可被存取的程式碼區域**。由宣告位置決定,編譯期靜態綁定。
| 作用域 | 宣告位置 | 可見範圍 | 典型代表 | 生命週期 |
|---|---|---|---|---|
| 區塊作用域 | `{ ... }` 區塊內 | 從宣告點到區塊結尾 `}` | 區域變數、函式參數 | 自動儲存期(進入區塊建立,離開銷毀) |
| 檔案作用域 | 所有區塊外部(全域) | 從宣告點到檔案結尾 | 全域變數、靜態全域變數、函式 | 靜態儲存期(程式啟動建立,結束銷毀) |
| 函式原型作用域 | 函式宣告的參數列表中 | 僅限該參數列表內 | 函式宣告中的參數名 | 無(僅供編譯器檢查,不佔記憶體) |
| 函式作用域 | 函式體內的標號 | 整個函式體 | `goto` 標號(`label:`) | 函式執行期間 |
int global = 10; // 檔案作用域,靜態生命週期
void func(int param) { // param: 區塊作用域(函式參數視為區塊)
static int count = 0; // 區塊作用域,靜態生命週期
int local = 0; // 區塊作用域,自動生命週期
{ // 內層區塊
int inner = 1; // 內層區塊作用域
} // inner 生命週期結束
} // local, param 銷毀;count 保留值
// 函式原型作用域範例
void foo(int x, int y); // x, y 僅在此行可見,可重複命名
void foo(int a, int b) { ... } // 定義時另起作用域
| 連結 | 關鍵字 | 作用域 | 跨檔案可見 |
|---|---|---|---|
| 外部連結 | 無 / `extern` | 檔案 | 是 |
| 內部連結 | `static`(全域) | 檔案 | 否 |
| 無連結 | `static`(區域)、區域變數、參數 | 區塊/函式原型 | 否 |
掌握四大作用域(區塊、檔案、函式原型、函式)與三種生命週期(自動、靜態、動態分配)的組合關係,是寫出模組化、無名字衝突、記憶體安全 C 程式的基石。**作用域是給編譯器看的,生命週期是給執行期記憶體管理看的。**