關於在C++使用extern “C”{…}

http://www.lslnet.com/linux/f/docs1/i34/big5262243.htm在c++程序中,下面的寫法表是什麼意思?

extern “C”{

#include ;

#include ;

#include ;

}

回答:
這是為了可以在c++程序裡面使用c的庫函數。

C++編譯器使用一種稱為”Name Mangling”的機制來支持函數重載和類型安全的鏈接。例如下面的重載函數:
void f(int);
void f(char);
經常被C++編譯器處理為類似_f_int()和_f_char()這樣的「內部」名字,用以區分重載函數,以及在鏈接的過程中保證對函數的調用被解析到正確的代碼上。

設想你在C++程序中調用C的庫函數。由於C沒有重載的概念,類型系統也比C++弱,所以C編譯器是不做Name Mangling的。如下面的函數聲明:
void f(int, char);
被C++編譯器處理後的名字應該是類似_f_int_char()這樣的,但是假設這個函數是一個C庫函數,你只有它的聲明(頭文件)和實現(已經編譯過,供鏈接的庫文件),而庫文件中的符號表是C編譯器生成的,這個函數的「內部」名字是_f()。鏈接的時候linker無法將對_f_int_char()的調用解析到_f()上,自然會出現鏈接錯誤。

解決的辦法就是用下面的聲明:
extern “C” void f(int, char);
告訴C++編譯器,這不是一個C++函數,編譯時需要按照C語言的規則來處理名字,以便linker能夠正確鏈接。

可以用下面的格式集中聲明很多這種函數:
extern “C” {
fun1();
fun2();

}

也可以用下面的格式,將一個頭文件中的全部函數,聲明為按照其他語言的編譯方式來處理。
extern “C” {
#include ;
}

分類: 未分類

發表迴響