static 類型 函數名(參數) { ... }
// 僅在本源文件可見,異文件同名不衝突
又稱靜態函數,static 此處限制作用域非存儲方式。
extern 類型 函數名(參數) { ... }
// 整個程序可見,跨文件調用需聲明
默認隱含 extern。跨文件調用示例:
/* F1.c */
main() {
extern int f1(int i); // 聲明
f1(10);
}
/* F2.c */
extern int f1(int i) { ... } // 定義
| 分類維度 | 類別 |
|---|---|
| 來源 | 庫函數 / 用戶定義函數 |
| 返回值 | 有返回值(聲明類型) / 無返回值(void) |
| 參數 | 有參 / 無參 |
| 作用域 | 內部 / 外部 |
[extern/static] 類型 函數名([參數表]) // 定義
[extern] 類型 函數名([參數表]); // 聲明
函數名([實參表]) // 調用
return 返回單一值| 存儲方式 | 存儲類型 | 關鍵字 | 定義位置 | 生存期 | 作用域 | 初始值 | 可初始化類型 |
|---|---|---|---|---|---|---|---|
| 動態 | 自動變量 | auto | 函數/復合語句內 | 調用期間 | 定義它的函數/語句內 | 不定 | 基本類型 |
| 寄存器變量 | register | 函數/復合語句內 | 調用期間 | 定義它的函數/語句內 | 不定 | int/char | |
| 靜態 | 外部變量 | extern | 函數外部 | 整個程序 | 整個源程序 | 0 | 任何類型 |
| 靜態局部變量 | static | 函數/復合語句內 | 整個程序 | 定義它的函數/語句內 | 0 | 任何類型 | |
| 靜態 | 靜態全局變量 | static | 函數外部 | 整個程序 | 定義它的源文件內 | 0 | 任何類型 |
理解存儲類型是掌握變量生命週期、作用域、鏈接屬性的關鍵,對編寫正確、高效的 C 程序至關重要。