在C++中,extern關鍵字經常會被用到,但不同場景下的含義又有所不同。本文將從多個方面對extern關鍵字做詳細的闡述,讓讀者更好地理解並熟練掌握extern的使用。
一、全局變量中的extern
在C++的全局變量定義中,extern關鍵字與static關鍵字是兩個相互矛盾的概念。全局變量定義時,如果前面沒有加上extern關鍵字,那麼該變量在其他的文件中就無法使用;而如果在其他文件中使用該變量,需要在聲明的時候加上extern關鍵字。
// file1.cpp
int g_num = 100; // 默認為extern int g_num = 100;
// file2.cpp
extern int g_num; // 在此文件中聲明g_num的類型和名稱,不需要初始化
int main() {
cout << g_num << endl; // 輸出100
return 0;
}
上面的代碼中,第一個文件中定義了一個全局變量g_num,並將其初始化為100。在第二個文件中使用該變量時,需要在前面加上extern關鍵字,代表該變量在其他的文件中已經被定義。這樣之後,g_num就可以在第二個文件中被使用了。
二、函數聲明中的extern
在函數聲明中,extern關鍵字通常可以省略。當然,如果你願意的話可以自己主動添加extern關鍵字以強調函數是被聲明而非定義的。
// external.h
int max(int a, int b);
// external.cpp
int max(int a, int b) {
return a > b ? a : b;
}
// main.cpp
#include "external.h"
int main() {
int a = 100, b = 200;
int result = max(a, b);
cout << result << endl; // 輸出200
return 0;
}
在上面的代碼中,external.h頭文件中聲明了一個max函數,但並沒有在該文件中定義該函數;這樣在external.cpp文件中定義該函數,在main.cpp文件中使用該函數時,只需要在頭文件中進行聲明即可。
三、extern “C”關鍵字
C++是一個支持函數重載的語言,因此C++不同的函數可以有相同的名稱。然而,C語言並不支持函數重載。為了在C++中調用C函數,需要用到extern “C”關鍵字。
// external.c
void print_hello() {
printf("Hello\n");
}
// main.cpp
extern "C" {
void print_hello();
}
int main() {
print_hello(); // 輸出Hello
return 0;
}
在上面的代碼中,external.c文件定義了一個打印Hello的函數print_hello。為了在C++中使用該函數,需要在C++文件中使用extern “C”加上函數聲明,來告訴編譯器這是一個C風格的函數。
四、extern關鍵字的其他用途
1. 引用變量
除了全局變量外,extern關鍵字還可以用來引用其他文件中的全局變量。
// external.cpp
int num = 100;
// main.cpp
extern int num;
int main() {
cout << num << endl; // 輸出100
return 0;
}
在上面的代碼中,main.cpp文件中引用了external.cpp文件中定義的全局變量num,因此需要在前面加上extern關鍵字進行聲明。
2. volatile關鍵字
volatile關鍵字用來修飾變量,用來告訴編譯器,該變量是易變的。而如果在多個文件中使用同一個易變的變量,需要在對應的文件中加上extern關鍵字。
// external.cpp
volatile int num = 100;
// main.cpp
extern volatile int num;
int main() {
while (num < 200) {
// do something
}
return 0;
}
在上面的代碼中,雖然num是一個全局變量,但由於該變量是易變的,因此在外部使用時需要加上volatile關鍵字,並在main.cpp中使用extern關鍵字進行聲明。
3. inline函數
在定義inline函數時,需要使用extern關鍵字進行修飾。inline函數可以用作小規模代碼的優化,將某個函數體的內容插入到對應的調用處。
// external.cpp
extern inline int max(int a, int b) {
return a > b ? a : b;
}
// main.cpp
int main() {
int a = 100, b = 200;
int result = max(a, b);
cout << result << endl; // 輸出200
return 0;
}
在上面的代碼中,external.cpp文件中定義了一個inline函數max,並在main.cpp中進行了調用。為了保證inline函數能夠正確地進行定義和調用,需要在定義的時候使用extern關鍵字進行修飾。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/230714.html
微信掃一掃
支付寶掃一掃