我已阅读以下文章here,其中解释了如何从纯C代码调用基于c ++的函数。
最好用以下示例解释该方法:
// C++ code:
class C {
// ...
virtual double f(int);
};
extern "C" double call_C_f(C* p, int i) // wrapper function
{
return p->f(i);
}
/* C code: */
double call_C_f(struct C* p, int i);
void ccc(struct C* p, int i)
{
double d = call_C_f(p,i);
/* ... */
}
但是,我无法理解我在哪里定义了由' p'指向的实例。请注意,在C代码中,它作为指向opaque结构的指针传递,并且在C ++代码中,它被假定为指向class C
的有效实例的指针,但我没有看到这个指针正在初始化。
P.S。 当然,使用适当的编译器编译与不同语言相关的每个代码块,并创建不同的目标文件。
答案 0 :(得分:6)
您需要类似的包装器方法来创建和销毁C ++对象。
C ++代码:
extern "C" C * create_c()
{
return new C;
}
extern "C" void destroy_c(C *p)
{
delete p;
}
C代码:
// forward declarations (better to put those in a header file)
struct C;
struct C * create_c();
double call_C_f(struct C* p, int i);
void destroy_c(struct C *p);
struct C * p = create_c();
double result = call_C_f(p, i);
destroy_c(p);
p = NULL;
答案 1 :(得分:3)
如果是您的示例,p
是您的班级C
的对象。您必须在C ++代码中创建它,然后将其传递给C。
您还应该在C中将指向C ++类的指针声明为void *
。类型未知,struct C
表示它是已知的结构,这是错误的。
示例:
extern "C" {
struct C;
struct C *create_c(void)
{
return new C;
}
void destroy_c(struct C *ptr)
{
delete ((C*)ptr);
}
}
答案 2 :(得分:0)
您可以使用C ++创建它,最有可能使用new C()
。没有办法在C中可移植地创建它,所以如果C代码必须能够构造新的实例,你必须为它编写extern "C" C* construct_C();
工厂函数;同样对于析构函数。