亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從C調用C ++函數?

如何從C調用C ++函數?

C++ C
慕田峪7331174 2019-08-12 10:37:22
如何從C調用C ++函數?我知道這個。從C ++調用C函數:如果我的應用程序是在C ++中,我不得不從用C編寫的庫調用函數。那么我會使用//main.cppextern "C" void C_library_function(int x, int y);//prototypeC_library_function(2,4);// directly using it.這不會破壞名稱C_library_function,鏈接器會在其輸入* .lib文件中找到相同的名稱,問題就解決了。從C ???調用C ++函數但是在這里我擴展了一個用C語言編寫的大型應用程序,我需要使用一個用C ++編寫的庫。C ++的名稱錯誤導致了麻煩。Linker抱怨未解決的符號。好吧,我不能在我的C項目中使用C ++編譯器,因為這會破壞很多其他東西。出路是什么?順便說一句,我正在使用MSVC
查看完整描述

3 回答

?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

您需要創建一個C API來公開C ++代碼的功能?;旧?,您需要編寫聲明為extern“C”且具有包裝C ++庫的純C API(例如,不使用類)的C ++代碼。然后使用您創建的純C包裝器庫。

您的C API可以選擇遵循面向對象的樣式,即使C不是面向對象的。例如:

 // *.h file
 // ...
 #ifdef __cplusplus #define EXTERNC extern "C"
 #else
 #define EXTERNC #endif

 typedef void* mylibrary_mytype_t;

 EXTERNC mylibrary_mytype_t mylibrary_mytype_init();
 EXTERNC void mylibrary_mytype_destroy(mylibrary_mytype_t mytype);
 EXTERNC void mylibrary_mytype_doit(mylibrary_mytype_t self, int param);

 #undef EXTERNC // ...


 // *.cpp file
 mylibrary_mytype_t mylibrary_mytype_init() {
   return new MyType;
 }

 void mylibrary_mytype_destroy(mylibrary_mytype_t untyped_ptr) {
    MyType* typed_ptr = static_cast<MyType*>(untyped_ptr);
    delete typed_ptr;
 }

 void mylibrary_mytype_doit(mylibrary_mytype_t untyped_self, int param) {
    MyType* typed_self = static_cast<MyType*>(untyped_self);
    typed_self->doIt(param);
 }


查看完整回答
反對 回復 2019-08-12
?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

假設C ++ API是C兼容的(沒有類,模板等),你可以將它包裝進去extern "C" { ... },就像你走另一條路一樣。

如果你想暴露對象和其他可愛的C ++東西,你將不得不編寫一個包裝器API。


查看完整回答
反對 回復 2019-08-12
  • 3 回答
  • 0 關注
  • 837 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號