我将C ++对象包装在C结构中以在纯接口中公开它们。为了简化和减少代码,我在下面编写代码。我的问题是代码将按预期执行吗?如果不是为什么?
谢谢你,最好的问候。
// 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;
}
}
上面的代码似乎可以在我的PC上很好地运行,但是当我将其移植到Android时,某些总线上升了,我还不知道为什么。请帮忙!
答案 0 :(得分:1)
类型没有language linkage。 (从名义上说,他们的成员名字可以,但是always “C++”并不重要。)
因此,没有struct
定义的 do 链接规范,您可以做自己喜欢的事情。显然,这样的struct
类型在C语言中永远不可能是完整的,但这也没有关系。总线错误出现在其他地方。