C代码与C++数据结构

Vic*_*lea 5 c c++ gcc

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

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

我正在使用GCC.

Car*_*rum 6

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


Mar*_*ork 6

如果使用C++编译器编译所有代码,则应该没有(或很少)问题.

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

例:

MyClass.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
Run Code Online (Sandbox Code Playgroud)

源文件

MyClass.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);
}
Run Code Online (Sandbox Code Playgroud)

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

MyCFile.c

#include "MyClass.h"

int main()
{
    void* myClass =  createMyClass();
    int value = doStuffMyClass(myClass, 5, 6.0);
    destroyMyClass(myClass);
}
Run Code Online (Sandbox Code Playgroud)


Cap*_*ous 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记在标题中的`extern"C"`周围使用`#ifdef __cplusplus`,这样它们就可以在C中使用,并捕获C++代码中可能出现的任何异常(C不喜欢异常.. ).此外,不是使用`void*`作为对象指针,而是可能需要向前声明一个虚拟`struct`以使其具有最小的类型安全性. (2认同)