我有一个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 *
,但这可能导致类型不安全。
答案 0 :(得分:0)
你做不到。正如Lightness所说,C ++中没有结构;只有课程。它们的表现可能不同。
你只能在C ++部分定义extern "C"
个免费函数,它们获得一个指向类的指针,并将它们暴露给C代码。
答案 1 :(得分:0)
让CFooInit
返回CFoo*
,使用void*
。同样适用于CFooRelease
,CFooMethod
。忘记typedef struct Foo CFoo
。
当然,这些功能必须在void*
和Foo*
之间投射,但这是你为混合不同类型系统而付出的代价。
假装通过某种C类型从C ++类型派生出来可以获得某些东西是没有价值的。