我将C ++对象包装在C struct中,以在纯接口中公开它们。为了简化和减少代码,我在下面编写代码。我的问题是代码是否会按预期执行?如果不是为什么?
感谢你并致以真诚的问候。
// header file interface.h
#ifdef __cplusplus
extern "C"
{
#endif
typedef struct my_wrapper_t my_wrapper_t;
my_wrapper_t* my_wrapper_create();
void my_wrapper_destroy(my_wrapper_t* ptr);
#ifdef __cplusplus
}
#endif
// c++ file interface.cpp
template <typename T>
struct Wrapper
{
~Wrapper
{
if (rep)
{
delete rep;
}
}
template <typename Derived, typename ...Args>
static Derived * create(Args ... args)
{
auto p = new Derived;
p->rep = new T(std::forward<Args>(args)...);
return p;
}
T* rep;
}
extern "C"
{
struct my_wrapper_t : public Wrapper<Object>{}; // Object is c++ class define somewhere else
// implement interface as below
my_wrapper_t* my_wrapper_create()
{
return Wrapper<my_wrapper_t>::create(...);
}
void my_wrapper_destroy(my_wrapper_t* ptr)
{
delete ptr;
}
}
上面的代码似乎在我的电脑上运行良好,但当我将它移植到Android时,一些总线上升,我无法弄清楚为什么。请帮忙!
类型没有language linkage。 (从理论上讲,他们的成员名称可以,但它是always “C++”并不重要。)
所以没有任何关于你的struct
定义的链接规范,你可以做你喜欢的。显然,这样的struct
类型在C中永远不会完整,但这也无关紧要。其他地方出现了总线错误。