C的大部分代碼可以在C++中直接使用,但是仍然有需要注意的地方。
如果需要在C++中調用C實現的庫中的方法
extern “C” //指示編譯器這部分代碼使用C的方式進行編譯而不是C++
``
- 衆所周知,C是面向過程的語言,沒有函數重載。
void func(int x, int y);
- 對於
func
函數 被C的編譯器編譯後在函數庫中的名字可能爲func
(無參數符號),而C++編譯器則會產生類似funcii
之類的名字。
- 有相同內容的文件
//main.c / main.cpp
int func(int x,int y){}
int main(){return 0;}
- 進行編譯
gcc main.c -o mainc.o
gcc main.cpp -o maincpp.o
nm -A mainc.o
nm -A maincpp.o
-
結果
-
那麼這樣導致的問題就在於: c的.h頭文件中定義了
func
函數,則.c源文件中實現這個函數符號都是func
,然後拿到C++中使用,.h文件中的對應函數符號就被編譯成另一種,和庫中的符號不匹配,這樣就無法正確調用到庫中的實現。
因此,對於C庫可以:
#ifdef __cplusplus
extern "C"{
#endif
void func(int x,int y);
#ifdef __cplusplus
}
#endif
//__cplusplus 是由c++編譯器定義的宏,用於表示當前處於c++環境
或者在C++ 引用C文件的地方
extern "C"{
#include "lsn02.c"
}
extern 關鍵字 可用於變量或者函數之前,表示真實定義在其他文件,編譯器遇到此關鍵字就會去其他模塊查找