C C 混合程式設計

2021-08-05 19:29:09 字數 1197 閱讀 5555

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 編譯後庫中函式名會...