从C代码调用C ++方法

时间:2016-04-18 10:59:06

标签: c++ c

我已阅读以下文章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。 当然,使用适当的编译器编译与不同语言相关的每个代码块,并创建不同的目标文件。

3 个答案:

答案 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();工厂函数;同样对于析构函数。