版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengfengdiandia/article/details/82704375
现在有个类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<Person *>(p); // 释放
}
int call_Person_GetAge(void *p) {
return static_cast<Person *>(p)->GetAge();
}
const char *call_Person_GetName(void *p) {
return static_cast<Person *>(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