猿问

如何从C调用C ++函数?

如何从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


慕田峪7331174
浏览 807回答 3
3回答

慕桂英4014372

您需要创建一个C API来公开C ++代码的功能。基本上,您需要编写声明为extern“C”且具有包装C ++库的纯C API(例如,不使用类)的C ++代码。然后使用您创建的纯C包装器库。您的C API可以选择遵循面向对象的样式,即使C不是面向对象的。例如:&nbsp;//&nbsp;*.h&nbsp;file &nbsp;//&nbsp;... &nbsp;#ifdef&nbsp;__cplusplus&nbsp;#define&nbsp;EXTERNC&nbsp;extern&nbsp;"C" &nbsp;#else &nbsp;#define&nbsp;EXTERNC&nbsp;#endif &nbsp;typedef&nbsp;void*&nbsp;mylibrary_mytype_t; &nbsp;EXTERNC&nbsp;mylibrary_mytype_t&nbsp;mylibrary_mytype_init(); &nbsp;EXTERNC&nbsp;void&nbsp;mylibrary_mytype_destroy(mylibrary_mytype_t&nbsp;mytype); &nbsp;EXTERNC&nbsp;void&nbsp;mylibrary_mytype_doit(mylibrary_mytype_t&nbsp;self,&nbsp;int&nbsp;param); &nbsp;#undef&nbsp;EXTERNC&nbsp;//&nbsp;... &nbsp;//&nbsp;*.cpp&nbsp;file &nbsp;mylibrary_mytype_t&nbsp;mylibrary_mytype_init()&nbsp;{ &nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;MyType; &nbsp;} &nbsp;void&nbsp;mylibrary_mytype_destroy(mylibrary_mytype_t&nbsp;untyped_ptr)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;MyType*&nbsp;typed_ptr&nbsp;=&nbsp;static_cast<MyType*>(untyped_ptr); &nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;typed_ptr; &nbsp;} &nbsp;void&nbsp;mylibrary_mytype_doit(mylibrary_mytype_t&nbsp;untyped_self,&nbsp;int&nbsp;param)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;MyType*&nbsp;typed_self&nbsp;=&nbsp;static_cast<MyType*>(untyped_self); &nbsp;&nbsp;&nbsp;&nbsp;typed_self->doIt(param); &nbsp;}

跃然一笑

假设C ++ API是C兼容的(没有类,模板等),你可以将它包装进去extern "C" { ... },就像你走另一条路一样。如果你想暴露对象和其他可爱的C ++东西,你将不得不编写一个包装器API。
随时随地看视频慕课网APP
我要回答