我创建了一个C ++程序和类,并计划将其编译为库。我找到了几个网站,解释了如何创建和使用包装器来访问C ++类方法。
我的环境是IAR EWARM,在我的情况下我需要使用标准C.要创建类实例化对象,我正在使用(或将需要使用)运算符“new”,即对于类“scrnDev”:bLink1 = new(scrnDev);
我一直在搜索有关如何使用C程序中的“new”运算符实例化对象的信息,但无法找到如何实现这一点。
答案 0 :(得分:7)
通常的方法是创建一些可以从c调用的c ++函数,并为内部分配的类返回一个void*
句柄:
extern "C" {
void* createScrnDev() {
return new scrnDev();
}
}
此包装器API中的其他函数将获取句柄,并将其强制转换回原始对象实例:
extern "C" {
void blink(void* scrnDev_) {
static_cast<scrnDev*>(scrnDev_)->blink();
}
}
最后,您需要destroy()
函数才能正确调用delete
:
extern "C" {
void destroyScrnDev(void* scrnDev_) {
delete static_cast<scrnDev*>(scrnDev_);
}
}
如评论中所述,您还可以使用opaque pointer,它使用两种语言中使用的struct
声明:
<强> scrnDev.h
强>:
struct scrnDevHandle;
scrnDevHandle* createScrnDev();
void blink(scrnDevHandle* scrnDev_);
void destroyScrnDev(scrnDevHandle* scrnDev_);
<强> scrnDev.cpp
强>:
class scrnDev : public scrnDevHandle {
public:
scrnDev() {}
blink() {
// ...
}
};
extern "C" {
scrnDevHandle * createScrnDev() {
return new scrnDev();
}
void blink(scrnDevHandle* scrnDev_) {
static_cast<scrnDev*>(scrnDev_)->blink();
}
void destroyScrnDev(scrnDevHandle* scrnDev_) {
delete static_cast<scrnDev*>(scrnDev_);
}
}
您可能有兴趣阅读有关extern "C" {}
接口here