extern “C”
由于c++中需要支持函數重載,所以c和c++中對同一個函數經過編譯后生成的函數名是不相同的
extern “C” 的主要作用就是為了實現c++代碼能夠調用其他 c 語言代碼。
1(不常用)
//告訴編譯器 show() 函數按c語言的方式進行編譯和鏈接
extern "C" void show();
2(常用)
// C頭文件中使用
#if __cplusplusextern "C"{
#endif
//放 C頭文件聲明
//void func1();
//...#if __cplusplus}
#endif
其他
在Linux下測試:
c函數: void MyFunc(){} ,被編譯成函數: MyFunc
c++函數: void MyFunc(){},被編譯成函數: _Z6Myfuncv
由于c++中需要支持函數重載,所以 c 和 c++ 中對同一個函數經過編譯后生成的函數名是不相同的。
這就導致了一個問題,如果在 c++ 中調用一個使用 c 語言編寫模塊中的某個函數,
那么 c++ 是根據 c++ 的名稱修飾方式來查找并鏈接這個函數,那么就會發生鏈接錯誤。
以上例,c++ 中調用 MyFunc 函數,在鏈接階段會去找 _Z6Myfuncv,結果是沒有找到的,
因為這個 MyFunc 函數是c語言編寫的,生成的符號是 MyFunc。
所以
extern "C"的主要作用就是為了實現 c++ 代碼能夠調用其他 c 語言代碼。
加上extern "C"后,這部分代碼編譯器按c語言的方式進行編譯和鏈接,而不是按c++的方式。