为了账号安全,请及时绑定邮箱和手机立即绑定

如何从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 关注
  • 806 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信