| 關鍵字 | 修飾對象 | 作用域 | 鏈接屬性 | 存儲期 |
|---|---|---|---|---|
static | 全局變量/函數 | 僅當前源文件 | 內部鏈接 | 靜態存儲 |
static | 局部變量 | 僅當前函數 | 無鏈接 | 靜態存儲 |
extern | 全局變量/函數聲明 | 全程序可見 | 外部鏈接 | 靜態存儲 |
static int module_private = 0; // 僅本文件可見
int public_counter = 0; // 全程序可見
static void internal_init(void) { ... } // 內部函數
void public_api(void) { // 導出函數
static int call_count = 0; // 函數級靜態,保持調用次數
call_count++;
}
extern int public_counter; // 聲明外部定義
extern void public_api(void);
int main(void) {
public_api();
printf("Counter: %d\n", public_counter);
return 0;
}
// A.cpp 調用 a.c 的符號
extern "C" {
extern int public_counter;
extern void public_api(void);
}
int main() {
public_api(); // 正確調用C函數
}
原理:C++編譯器對函數名進行Name Mangling(如_Z9public_apiv),extern "C"強制使用C語言符號命名(public_api),使鏈接器能匹配C編譯生成的符號。
static,僅在頭文件中extern聲明真正需要導出的接口__thread/thread_local)extern聲明,定義放在唯一的.c文件中.c定義同名非static全局 → 鏈接錯誤static函數互不干擾,但調試器可能顯示混淆