天天看點

關于extern "C"

如果要混合連結C和C++的代碼,就需要用到extern "C"。

1 C++要到C的函數

如果在.c檔案裡面定義了一個函數void func(int para),在.cpp檔案中要用到該函數,那必須在C++代碼(可以放cpp檔案中或頭檔案中)中聲明該函數,這樣編譯的時候才能通過,否則編譯器會提示找不到該函數的定義。

聲明的方法必須是:

extern "C"
void func(int para);
           

extern "C"在這裡的作用是,告訴C++ compiler,在連結cpp檔案的時候,如果遇到func調用,不必對func進行函數名的mangle。因為該函數func是用C語言寫的,是以在obj檔案中,func函數的名字就是叫做func。而C++不一樣,由于要支援函數重載,C++ compiler一般會對函數名進行重命名,具體規則依不同編譯器的不同而有差異。如果C++調用C++自己的函數,定義的函數名和調用函數名都進行了重命名,是以沒有問題。但C compiler不會做此重命名,如果C++代碼調用了C語言寫的函數,如果不做extern "C"聲明,C++ linker會從obj檔案中找重命名過的函數名,這時候就會找不到。extern "C"告訴C++ linker,連結此函數時,不用進行函數重命名,直接用原來的名字搜尋obj檔案,這樣就能找到。

2 C++寫的函數要提供給C

比如C++要寫個lib給C調用。同樣,在C++代碼中要用extern "C"來聲明要給C調用的函數。

.h或.cpp檔案中

extern "C"
void func(int para);
           

.cpp檔案中

void func(int para)
{
.... //具體的實作
}
           

這樣,當C++ compiler編譯該檔案時,就不會對該檔案進行重命名,obj檔案中仍然是它原來的函數名。這樣C代碼就可以直接用原來的函數名調用該函數。

不管是上面的哪種情況,extern "C"都是在cpp代碼中出現,不應該在C代碼中出現,C沒有這個指令。是以,在所有出現extern “C”的地方,應該用一個宏包含進去

#ifdef _cplusplus

extern "C"

#endif

繼續閱讀