首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

深入理解 C/C++ 中 static 關鍵字的多重語義

     編輯:關於C

static 的四大使用場景

static 在 C/C++ 中根據上下文有截然不同的含義,核心在於「生命週期延長」與「作用域限制」的組合。

1. 靜態全局變量:文件級作用域

// file1.c
static int i = 0;

// file2.c
extern int i; // 鏈接錯誤:undefined reference to 'i'

static 修飾全局變量時,該符號不參與外部鏈接,僅在當前編譯單元可見。不同文件可定義同名靜態全局變量互不干擾。

2. 靜態局部變量:函數級持久化

void test() {
    static int i = 1; // 僅初始化一次
    i++;
    printf("i=%d\n", i);
}

void test2() {
    int j = 0; // 每次調用重新初始化
    j++;
    printf("j=%d\n", j);
}
  • 存儲在靜態存儲區,程序啟動時分配,結束時釋放
  • 首次執行到聲明處完成初始化,後續調用跳過初始化直接使用舊值
  • 不同作用域的同名靜態局部變量佔用不同內存

3. 靜態函數:內部鏈接

修飾函數時同樣限制符號在文件內可見,類似 C++ 的無名命名空間,避免符號衝突,實現封裝。

4. 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() 調用

5. 默認零初始化

靜態存儲區變量(全局、靜態局部、靜態成員)若無顯式初始化,自動按 0 初始化(標量為 0,指針為 nullptr,對象調用默認構造)。

摘自 Crazybaby's blog

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved