我有一个C ++方法,它将std::list
作为函数参数;它在调用时填充该列表。
我想使用extern
从C调用此方法。
如何在从C调用时匹配函数参数?
请在下面找到伪代码:
void getlist(std::list<Object *object> list)
{
list.push_back("A");
}
extern "C"
{
void list()
{
getlist(/*?*/);
}
}
那么,如何使用所需参数调用getlist
方法?
答案 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调用它。显然,这样的函数需要一些支持函数,例如创建列表的函数和销毁它的函数。