可以定义一个在extern“C”块中继承另一个结构的结构吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以定义一个在extern“C”块中继承另一个结构的结构吗?相关的知识,希望对你有一定的参考价值。

我将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中永远不会完整,但这也无关紧要。其他地方出现了总线错误。

以上是关于可以定义一个在extern“C”块中继承另一个结构的结构吗?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中,一个文件中的函数想用另一个文件中定义的结构体怎么办,用extern好像解决不了

C语言20-static和extern关键字2-对变量的作用

extern关键字

如何将 Obj-C 块保存在 C 结构中?

C语言中extern的意思是啥?

extern和extern "C"