c++ 是在 c 語言的基礎上發展起來的。在某種程度上,我們可將 c++ 看做 c 的一種擴充套件。在本質上,二者的資料型別和函式呼叫慣例都是一致的,因此 c 與 c++ 混合編譯也是很自然的事情。
二者的區別僅在於編譯後函式的名字不同──c 簡單地使用函式名而不考慮引數的個數或型別,而 c++ 編譯後的函式名則總是將引數型別列表作為其一部分。儘管如此,c++ 提供了特殊的機制來宣告 c 函式,這意味著乙個 c++ 程式可以直接宣告和呼叫 c 函式。
下面是 c++ 程式呼叫 c 函式 csayhello() 的乙個例子。由於該函式在 c++ 程式內宣告時使用了 extern "c",故呼叫可以直接進行:
/* cpp2c.cpp */#include
extern
"c"void csayhello(
char
*str);
int main(
int argc,char
*argv)
c 函式不需任何特殊處理,其**如下:
/* csayhello.c */#include
void csayhello(
char
*str)
下面三條命令編譯以上兩個檔案並將二者鏈結為乙個可執行檔案。由於 gcc 和 g++ 的靈活性使得存在很多方法來完成該任務,但這三條命令或許是最常用的:
$ g++ -c cpp2c.cpp -o cpp2c.o注意到,在最後鏈結的時候指定 c++ 標準庫是必須的,這是因為我們用的是 gcc 而不是 g++ 呼叫的鏈結器。如果使用的是 g++ 的話,c++ 標準庫缺省會被鏈結。$ gcc -c csayhello.c -o csayhello.o
$ gcc cpp2c.o csayhello.o -lstdc++ -o cpp2c
最普遍的做法是,將函式宣告放到標頭檔案中,然後將所有內容包含在 extern "c" 宣告塊內。檔案內容像下面所示:
extern"c";
要使 c 程式能夠呼叫 c++ 中函式的話,c++ 提供乙個符合 c 呼叫慣例的函式是必須的。下面的例子演示了在 c++ 內建立 c 函式的語法:
/* cppsayhello.cpp */#include
extern
"c"void cppsayhello(
char
*str);
void cppsayhello(
char
*str)
儘管函式 cppsayhello() 通過 extern "c" 宣告為 c 函式,事實上它是 c++ 源**的一部分,這意味著函式體內是真正的 c++ **。在函式內你可以自由地建立和析構物件。如果你要在 cppsayhello() 內呼叫 c 函式的話,將其宣告為 extern "c" 是必須的。否則,編譯器會將作為乙個 c++ 函式並相應地更改函式名。
下面是呼叫 c++ 函式 cppsayhello() 的 c 程式:
/* c2cpp.c */int main(
int argc,char
*argv)
下面的命令編譯並鏈結生成c2cpp:
$ g++ -c cppsayhello.cpp -o cppsayhello.o$ gcc -c c2cpp.c -o c2cpp.o
$ gcc cppsayhello.o c2cpp.o -lstdc++ -o c2cpp
c與c 混合程式設計
在純c的系統中使用c 的類出現了編譯錯誤!程式 begin mymain.c include thesocket.h void main int argc,char argv end mymain.c begin thesocket.h class thesocket end thesocket.h...
c與c 混合程式設計
1.引言 c 語言的建立初衷是 a better c 但是這並不意味著c 中類似 c語言的全域性 變數和函式所採用的編譯和連線方式與c語言完全相同。作為一種欲與c相容的語言,c 保留了一部分過程式語言的特點 被世人稱為 不徹底地物件導向 因而它可以定義不屬於任何類的全域性變數和函式。但是,c 畢竟是...
C與C 混合程式設計
c呼叫c 的函式和變數時,c 的標頭檔案要加extern c 且.c檔案不能直接包含extern c 的標頭檔案,要另外用extern 宣告所要用的c 中的函式。ifdef cplusplus extern c endif ifdef cplusplus endif c 呼叫c的函式和變數時,c 檔...