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

Nav*_*mar 2 c

我有一个C++方法,它接受std::list一个函数参数; 它在调用时填充该列表.

我想用C语言调用这个方法extern.

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

请在下面找到伪代码:

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

extern "C"
{
    void list()
    {
        getlist(/*?*/);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

101*_*010 5

不幸的是,您必须依赖于void*在C中传达您的界面.

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

例如,您必须将列表创建为:

extern "C" void* create_list(void) {
  return new std::list<Object*>;
}
Run Code Online (Sandbox Code Playgroud)

您必须在列表中附加为:

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_));
}
Run Code Online (Sandbox Code Playgroud)

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

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