c++ 呼叫 c 的步驟比較簡單,只需要將c的**使用extern 「c」包含宣告即可
cpp:
int main()
c: extern
"c"
通過extern 「c「的宣告,編譯器會將宣告部分按照c的語法進行編譯
c呼叫c++則比較繁瑣,需要謹記一點是c的**中決不能出現關於c++的任何語法,包含標頭檔案中也不可以。
所以通常的做法是將c++進行一層封裝
舉個例子:
首先 在cxx.h中 實現乙個類的宣告,類包含乙個成員函式
class
cxx
在cxx.cpp中實現成員函式
int cxx::cxx_call()
以上實現的是c++的功能實現,要被c**呼叫,還需要對功能實現**進行一層封裝
在cxx_impl.cpp中實現它
#include "cxx.h"
int c_call_cxx(void **ptr)
並在標頭檔案cxx_impl.h中宣告這個c介面
#indef __cplusplus
extern "c"
#endif
傳入空指標是為了做型別的傳遞,外部的c**不能直接訪問cxx這個類,但所幸指標都是同樣的大小,所以傳入空指標,傳入後自行做型別轉換
cxx_impl.h中的ifdef是為了在以c++編譯器編譯時,讓c函式int c_call_cxx(void *ptr)宣告被extern 「c」 宣告
傳入二級指標是為了返回申請的類的位址,方便繼續呼叫乙個類內的其他成員函式 避免每次呼叫不同的成員函式都申請乙個類
在test.c中呼叫:
int main()
注意:c呼叫c++時 需要把c的編譯器也設為c++所用的編譯器 這點在vs下是預設的 不需要修改
但在linux下,修手動指定
例如使用cmake
set(cmake_c_cpmpiler g++)
我寫了乙個參考的c呼叫c++實現的記憶體管理鍊錶的實現
linux下 cmake 建立的工程,可供呼叫的參考 稍後完善些再放上來
mem_collector
C C 混合程式設計
c中呼叫c c 中呼叫c都會用到extern c 但兩者的意義卻大不一樣!例 c void foo int x c c code extern c void foo int x 讓c 聯結器能通過過類似於 foo來查詢此函式,而非類似於 foo int這樣的符號。使用extern c 則是告訴編譯器...
C C 混合程式設計
分類 linux c c 2012 12 26 09 51 655人閱讀收藏 舉報cc 混合程式設計 externc cplusplus 現在,我們就來慢慢的了解吧。一 extern c 的作用 最重點 1.extern c 的真實目的是實現類c和c 的混合程式設計。extern c 是由 提供的乙...
C C 混合程式設計
現在,我們就來慢慢的了解吧。一 extern c 的作用 最重點 1.extern c 的真實目的是實現類c和c 的混合程式設計。extern c 是由 提供的乙個連線交換指定符號,用於告訴 這段 是 函式。extern c 後面的函式不使用的c 的名字修飾,而是用c。這是因為c 編譯後庫中函式名會...