5

我知道这不是开发项目的好方法,但出于我工作的某些原因,我致力于在 C 项目中集成 C++ 中的一些数据结构(LRU 缓存和哈希映射)。

到目前为止,我知道有一些方法可以使用 C++ 调用 C 函数extern "C",但是从 C 调用 C++ 对象(方法...)呢?

我正在使用 GCC。

4

3 回答 3

6

围绕你的 C++ 接口编写一个 C 包装器。将其编译为 C++,但请确保将您的 C 接口包含在一个extern "C"块中。这个新界面应该与您的 C 程序链接良好,并为您提供对 C++ 代码的访问。

于 2013-05-27T17:29:18.843 回答
6

如果所有代码都是用 C++ 编译器编译的,那么应该没有(或很少)问题。

如果你用 gcc 编译 C 和用 g++ 编译 C++,那么你需要在你的类周围编写一个头包装器,以通过一组函数使 C++ 代码可见。

例子:

我的类.h

#ifdef __cplusplus


class MyClass
{
    public:
       MyClass() {/*STUFF*/}
       ~MyClass() {/*STUFF*/}

       int doStuff(int x, float y) {/*STUFF*/}
};

extern "C" {
#endif

/* C Interface to MyClass */

void*   createMyClass();
void    destroyMyClass(void* mc);
int     doStuffMyClass(void* mc, int x, float y);

#ifdef __cplusplus
}
#endif

源文件

我的类.cpp

#include "MyClass.h"

void*   createMyClass()           {return reinterpret_cast<void*>(new MyClass);}
void    destroyMyClass(void* mc)  {delete reinterpret_cast<MyClass*>(mc);}

int     doStuffMyClass(void* mc, int x, float y)
{
    return reinterpret_cast<MyClass*>(mc)->doStuff(x,y);
}

您的 C 代码现在只包含“MyClass.h”并使用提供的 C 函数。

MyCFile.c

#include "MyClass.h"

int main()
{
    void* myClass =  createMyClass();
    int value = doStuffMyClass(myClass, 5, 6.0);
    destroyMyClass(myClass);
}
于 2013-05-27T17:44:49.440 回答
5

您需要创建与 C 兼容的转发函数,它们的第一个参数是指向对象的指针。然后转发函数[通常]将第一个参数转换为正确的对象类型并调用适当的成员函数。

// Function declaration in header
extern "C" void function(void *object, int param1, int param2);

// Function definition in source file
extern "C" function(void *object, int param1, int param2)
{
     static_cast<Object*>(object)->member_function(param1, param2);
}
于 2013-05-27T17:31:05.850 回答