通过头文件将C ++类暴露给C

时间:2017-01-22 12:25:51

标签: c++ c

我有一个C ++类,我想要公开给C.

class Foo {
   void Method();
}

桥接到C

typedef struct Foo CFoo;

#ifdef __cplusplus
extern "C" {
#endif

    CFoo * CFooInit();
    void CFooRelease(CFoo * v);

    void CFooMethod(CFoo * v);
#ifdef __cplusplus
}
#endif

在cpp文件中,我有

CFoo * CFooInit(){
   return new Foo();
}
void CFooRelease(CFoo * v){
   delete v;
}

void CFooMethod(CFoo * v){
   v->Method();
}

一切正常,但编译过程中有一个问题/警告。

'Foo': type name first seen using 'struct' now seen using 'class'

我知道,为什么会这样,但我不知道,如何解决它。我无法将class更改为struct,我在C代码中无法使用class关键字。我可以使用void *,但这可能导致类型不安全。

2 个答案:

答案 0 :(得分:0)

你做不到。正如Lightness所说,C ++中没有结构;只有课程。它们的表现可能不同。

你只能在C ++部分定义extern "C"个免费函数,它们获得一个指向类的指针,并将它们暴露给C代码。

答案 1 :(得分:0)

CFooInit返回CFoo*,使用void*。同样适用于CFooReleaseCFooMethod。忘记typedef struct Foo CFoo

当然,这些功能必须在void*Foo*之间投射,但这是你为混合不同类型系统而付出的代价。

假装通过某种C类型从C ++类型派生出来可以获得某些东西是没有价值的。