在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-tw/n/230714.html