我知道.

Calling C function from 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文件中找到相同的名称,问题就解决了.

Calling C++ function from C???

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

顺便说一下,我用的是MSVC

推荐答案

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

您的C API可以 Select 遵循面向对象的风格,即使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);
 }

C++相关问答推荐

以c格式打印时间戳

sizeof结果是否依赖于字符串的声明?

在C中使用动态内存分配找到最小的负数

为什么双重打印与C中的float具有不同的大小时具有相同的值?

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

什么是.c.h文件?

使用TCL C API导航到列表中的元素

接受任何参数的函数指针是否与接受不同参数的函数兼容

链接到底是如何工作的,我在这里到底做错了什么

可变宏不能编译

将复合文字数组用作临时字符串缓冲区是否合理?

无算术运算符和循环的二进制乘法

在Ubuntu上使用库部署C程序的最佳实践

';malloc():损坏的顶部大小';分配超过20万整数后

%g浮点表示的最大字符串长度是多少?

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

通过修改c中的合并排序对数组的偶数索引进行排序

GDB 用内容初始化数组