在 C 和 C++ 中,extern
是一個關鍵字,用于聲明變量或函數是在其他文件中定義的。它主要用于實現多個源文件之間的符號共享。
目錄
📌 一、C語言中的?extern
1. 基本作用
2. 示例說明
定義全局變量(只在一個?.c?文件中):
在另一個?.c?文件中使用該變量:
編譯方式:
3. 函數的?extern
4. 頭文件中使用?extern
📌 二、C++ 中的?extern
1. 基本用法與 C 相同
2.?extern "C"?的用途
使用場景:
示例:
📊 三、C vs C++ 中?extern?的對比
? 四、總結
📌 一、C語言中的?extern
1. 基本作用
- 告訴編譯器該變量或函數已經在別處定義,當前只是引用。
- 避免重復定義錯誤,同時允許鏈接器找到實際的定義位置。
2. 示例說明
定義全局變量(只在一個?.c
?文件中):
// main.c
#include <stdio.h>int globalVar = 10; // 全局變量定義extern void otherFunction(); // 聲明外部函數int main() {otherFunction();return 0;
}
在另一個?.c
?文件中使用該變量:
// other.c
#include <stdio.h>extern int globalVar; // 聲明為 extern,表示這個變量在別的地方定義void otherFunction() {printf("globalVar = %d\n", globalVar);
}
編譯方式:
gcc main.c other.c -o program
3. 函數的?extern
- 所有函數默認都是?
extern
?的。 - 所以你通常不會寫?
extern void func();
,而是直接聲明函數原型即可。
// main.c
void otherFunction(); // 默認就是 externint main() {otherFunction();return 0;
}
// other.c
#include <stdio.h>void otherFunction() {printf("Hello from otherFunction!\n");
}
4. 頭文件中使用?extern
為了方便管理多個 .c
文件中的變量引用,可以將 extern
聲明放在頭文件中:
// globals.h
#ifndef GLOBALS_H
#define GLOBALS_Hextern int globalVar; // 聲明為 extern#endif
然后在各個 .c
文件中包含這個頭文件:
// main.c
#include "globals.h"int globalVar = 10; // 只在這里定義一次int main() {...return 0;
}
// other.c
#include "globals.h"
#include <stdio.h>void otherFunction() {printf("globalVar = %d\n", globalVar);
}
📌 二、C++ 中的?extern
C++ 中的 extern
與 C 類似,但有一些擴展和差異。
1. 基本用法與 C 相同
// main.cpp
#include <iostream>int globalVar = 10;extern void otherFunction();int main() {otherFunction();return 0;
}
// other.cpp
#include <iostream>extern int globalVar;void otherFunction() {std::cout << "globalVar = " << globalVar << std::endl;
}
2.?extern "C"
?的用途
這是 C++ 獨有的功能,用于關閉 C++ 的名字改編(name mangling)機制,以便調用 C 編寫的函數或變量。
使用場景:
- 調用 C 庫函數
- 混合編程:C++ 調用 C 編寫的?
.c
?文件中的函數或變量
示例:
// C 函數聲明
extern "C" {void c_function();int c_variable;
}int main() {c_function();std::cout << "c_variable = " << c_variable << std::endl;return 0;
}
這告訴編譯器:這部分符號按照 C 的方式來處理,不要進行 C++ 的重載解析或名稱修飾。
📊 三、C vs C++ 中?extern
?的對比
特性 | C 中的?extern | C++ 中的?extern |
---|---|---|
基本用途 | 聲明變量/函數在其他文件中定義 | 同左 |
函數默認屬性 | 所有函數默認是?extern | 同左 |
頭文件使用 | 推薦在頭文件中用?extern ?聲明變量 | 同左 |
extern "C" | ? 不支持 | ? 支持,用于兼容 C |
名稱修飾(Name Mangling) | ? 無 | ? 存在,默認開啟,需用?extern "C" ?關閉 |
變量定義限制 | 只能在一個?.c ?文件中定義 | 同左(ODR 規則) |
? 四、總結
extern
?是 C/C++ 中用于跨文件訪問變量或函數的關鍵字。- 在 C 中主要用于多文件共享全局變量。
- 在 C++ 中除了類似功能外,還引入了?
extern "C"
?來支持與 C 的互操作。 - 正確使用?
extern
?可以避免重復定義錯誤,并提高模塊化設計能力。