我知道这个。

从C ++调用C函数:

如果我的应用程序是C ++,并且必须从用C编写的库中调用函数。

//main.cpp

extern "C" void C_library_function(int x, int y);//prototype
C_library_function(2,4);// directly using it.


这不会破坏名称C_library_function,并且链接器将在其输入* .lib文件中找到相同的名称,从而解决了问题。

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

但是在这里,我扩展了一个用C编写的大型应用程序,我需要使用一个用C ++编写的库。 C ++的名称修改在这里引起麻烦。链接器抱怨未解析的符号。好吧,我不能在我的C项目上使用C ++编译器,因为那会破坏很多其他东西。出路是什么?

顺便说一句,我正在使用MSVC

最佳答案

您需要创建一个C API以公开C ++代码的功能。基本上,您将需要编写声明为extern“ C”且具有用于包装C ++库的纯C API(例如,不使用类)的C ++代码。然后,使用创建的纯C包装器库。

即使C不是面向对象的,您的C API也可以选择遵循面向对象的样式。例如:

 // *.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);
 }

关于c++ - 如何从C调用C++函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39816710/

10-11 21:55
查看更多