C 调用 C++ 类

现在有个类Person,其中成员函数分别用于获取 name 和 age: - GetName() - GetAge()

我们希望可以在 C 代码中调用 C++ 类的方法。

person.h

class Person {

public:

Person(std::string name, int age);

~Person() {}

const char *GetName() { return name_.c_str(); }

int GetAge() { return age_; }

private:

std::string name_;

int age_;

};

person.cpp

Person::Person(std::string name, int age)

: name_(name), age_(age) {}

wrapper包装了 Person 的创建和释放,以及 Person 的成员函数。

wrapper.h

#ifdef __cplusplus

extern "C"

{

#endif

void *call_Person_Create();

void call_Person_Destroy(void *);

int call_Person_GetAge(void *);

const char *call_Person_GetName(void *);

#ifdef __cplusplus

}

#endif

wrapper.cpp

void *call_Person_Create() {

return new Person("Aland", 18); // 构造

}

void call_Person_Destroy(void *p) {

delete static_cast(p); // 释放

}

int call_Person_GetAge(void *p) {

return static_cast(p)->GetAge();

}

const char *call_Person_GetName(void *p) {

return static_cast(p)->GetName();

}

现在我们在 main.c 中调用 Person 的方法:

int main() {

void *p = call_Person_Create();

int age = call_Person_GetAge(p);

const char *name = call_Person_GetName(p);

call_Person_Destroy(p); // 记得释放 p

printf("name=%s, age=%d\n", name, age);

}

完整代码地址 https://github.com/alandtsang/cppdemo/tree/master/src/ccallcpp

参考

http://www.stroustrup.com/bs_faq2.html#callCpp

http://www.jonathanbeard.io/tutorials/Mixed_C_C++

http://sheldonrush.github.io/sheldon.is.a.geek/2015/06/27/How-to-call-C-calss-member-function-from-C/