如何使用extern从C调用带有签名std :: list的C ++方法?

时间:2015-10-19 06:10:06

标签: c

我有一个C ++方法,它将std::list作为函数参数;它在调用时填充该列表。

我想使用extern从C调用此方法。

如何在从C调用时匹配函数参数?

请在下面找到伪代码:

void getlist(std::list<Object *object> list)
{
    list.push_back("A");
}

extern "C"
{
    void list()
    {
        getlist(/*?*/);
    }
}

那么,如何使用所需参数调用getlist方法?

2 个答案:

答案 0 :(得分:5)

不幸的是,您必须依靠void*在C中传达您的界面。

extern "C" void getlist(void *list_) {
  std::list<Object*> *list = static_cast<std::list<Object*>*>(list_);
  list->push_back("A");
}

例如,您必须创建您的列表:

extern "C" void* create_list(void) {
  return new std::list<Object*>;
}

您必须在列表中追加

extern "C" void list_append(void *list_, void *obj_) {
  std::list<Object*> *list = static_cast<std::list<Object*>*>(list_);
  list->push_back(static_cast<Object*>(obj_));
}

最终你必须销毁你的列表以避免内存泄漏:

extern "C" void delete_list(void *list_) {
  delete static_cast<std::list<Object*>*>(list_);
}

答案 1 :(得分:3)

你不能;这不可能。要做到这一点,你需要能够在C中声明一个C ++类,这是不可能的。

但是,可以做的是创建一个以void*为参数的函数,并将该参数强制转换为std::list*(即指针)到std::list)。您可以从C调用它。显然,这样的函数需要一些支持函数,例如创建列表的函数和销毁它的函数。