static 在 C/C++ 中根據上下文有截然不同的含義,核心在於「生命週期延長」與「作用域限制」的組合。
// file1.c
static int i = 0;
// file2.c
extern int i; // 鏈接錯誤:undefined reference to 'i'
static 修飾全局變量時,該符號不參與外部鏈接,僅在當前編譯單元可見。不同文件可定義同名靜態全局變量互不干擾。
void test() {
static int i = 1; // 僅初始化一次
i++;
printf("i=%d\n", i);
}
void test2() {
int j = 0; // 每次調用重新初始化
j++;
printf("j=%d\n", j);
}
修飾函數時同樣限制符號在文件內可見,類似 C++ 的無名命名空間,避免符號衝突,實現封裝。
class Test {
static int i; // 聲明
int j, k;
public:
Test(int j, int k) : j(j), k(k) { i = j + k; }
static void GetI() { cout << i << endl; }
};
int Test::i = 0; // 定義必須在類外
this 指針,僅能訪問靜態成員,調用略快Test::GetI() 或對象 obj.GetI() 調用靜態存儲區變量(全局、靜態局部、靜態成員)若無顯式初始化,自動按 0 初始化(標量為 0,指針為 nullptr,對象調用默認構造)。
摘自 Crazybaby's blog