void counter() {
static int count = 0; // 僅初始化一次,存儲在靜態數據區
printf("%d ", ++count);
}
int main() {
counter(); // 1
counter(); // 2
counter(); // 3
}
本質:變量從棧移至全局/靜態存儲區,生命週期 = 程序運行期,但作用域仍限於函數內。
應用:函數內計數器、單例模式懶漢式初始化、避免大數組棧溢出。
// file1.c
static int global_var = 10; // 僅 file1 可見
void internal_func() { }
// file2.c
extern int global_var; // 鏈接錯誤:undefined reference
本質:符號不導出到符號表,其他編譯單元不可見。
工程意義:封裝,減少符號衝突,降低模塊耦合。
// utils.c
static void helper() { } // 僅本文件可調用
// main.c
// helper(); // 編譯/鏈接錯誤
同全局變量,實現文件級私有,C 語言無類/命名空間時的核心封裝手段。
| 聲明 | 存儲區 | 生命週期 | 作用域 | 鏈接性 |
|---|---|---|---|---|
| int a; | 靜態區 | 程序運行期 | 全局 | 外部 |
| static int a; | 靜態區 | 程序運行期 | 文件 | 內部 |
| 函數內 int a; | 棧 | 函數調用期 | 塊 | 無 |
| 函數內 static int a; | 靜態區 | 程序運行期 | 塊 | 無 |
| malloc 分配 | 堆 | 手動釋放 | 指針可達 | 無 |
this 指針,只能訪問靜態成員
// a.c 定義
int global = 10;
void func() { }
// b.c 使用
extern int global;
extern void func();
// C++ 調用 C 函數
extern "C" {
#include "c_header.h"
}
static 是 C 語言模塊化編程的基石:控制可見性、管理生命週期、避免命名污染。掌握其三大用法與工程法則,是寫出可維護、低耦合 C 代碼的前提。