C++ 中 extern “C” 的作用是什麼?


extern “C” 關鍵字用於使 C++ 中的函式名具有 C 連結。在這種情況下,編譯器不會對函式名進行修飾。讓我們首先了解 C++ 中的名稱修飾,然後討論 extern “C” 關鍵字。

在 C++ 中,我們可以使用函式過載功能。使用此功能,我們可以建立同名的函式。唯一的區別是引數的型別和引數的數量。這裡不考慮返回型別。現在問題來了,C++ 如何區分目的碼中的過載函式?

在目的碼中,它透過新增有關引數的資訊來更改名稱。這裡應用的技術稱為名稱修飾。C++ 沒有標準化的名稱修飾技術。因此,不同的編譯器使用不同的技術。

這是一個名稱修飾的示例。過載函式命名為 func(),還有一個函式 my_function()。

示例

int func(int x) {
   return x*x;
}
double func(double x) {
   return x*x;
}
void my_function(void) {
   int x = func(2); //integer
   double y = func(2.58); //double
}

一些 C++ 編譯器會將其更改如下:

示例

int __func_i(int x){
   return x*x;
}
double __func_d(double x){
   return x*x;
}
void __my_function_v(void){
   int x = __func_i(2); //integer
   double y = __func_d(2.58); //double
}

C 不支援函式過載,因此當我們在 C++ 中連結 C 程式碼時,我們必須確保符號的名稱不會更改。以下 C++ 程式碼將生成錯誤。

示例

int printf(const char *format,...);
main() {
   printf("Hello World");
}

輸出

undefined reference to `printf(char const*, ...)'
ld returned 1 exit status

出現此問題是因為編譯器更改了 printf() 的名稱。並且它找不到更新的 printf() 函式的定義。為了克服這個問題,我們必須在 C++ 中使用 extern “C”。當某些程式碼在此塊內使用時,C++ 編譯器確保函式名不會被修飾。因此名稱不會更改。因此,上面的程式碼將如下所示以解決此問題。

示例

extern "C"{
   int printf(const char *format,...);
}
main() {
   printf("Hello World");
}

輸出

Hello World

注意:這些程式碼塊在不同的編譯器中可能會產生不同的結果。

因此,extern “C” 基本上是一種連結規範。在每個編譯器中,我們都必須使用此關鍵字來指定 C 連結。我們還必須記住,連結規範必須在名稱空間範圍內。extern “C” 忽略類成員。

更新於:2019年7月30日

2K+ 瀏覽量

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告