gpt4 book ai didi

c++ - 环绕在 C++ 中使用 void* 接受其参数的 C 函数

转载 作者:行者123 更新时间:2023-12-01 14:51:32 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How can I pass a C++ lambda to a C-callback that expects a function pointer and a context?

(4 个回答)


去年关闭。




我正在从 freeRTOS 包装一个 C 函数,该函数创建一个任务并在 C++ 中使用 void 指针获取其参数。该函数看起来有点像这样:

void createTask(TaskFunction_t taskCode, void * args);
因此,根据我的理解,将 2 个参数传递给任务,我需要创建一个结构,将其地址转换为 void*,传递它,然后将其转换回原始状态,如下所示:
struct Params
{
const int a;
const double b;
};

static void task(void * args)
{
auto params = *static_cast<Params*>(args);
// do something with params.a and params.b
}

int main()
{
Params params{1, 2.2};
createTask(task, static_cast<void*>(&params));
}
包装此函数以便我可以传递可变数量的变量类型参数的首选方法是什么?我应该将 void * args 作为参数,还是可以使用模板或元组来简化此过程。

最佳答案

在 C++11 以后,你可以使用类似

static void call_task(void *args) {
auto& f = *static_cast<std::function<void()>*>(args);
f();
}
// note: need this to stay alive!
std::function<void()> f = [&](){
// Any arguments you like here
do_whatever(1, 2, 3)
};
CreateTask(call_task, static_cast<void*>(&f));
您需要确保 f 的使用生命周期比任务长(就像您对 Params 对象所做的那样)。

你实际上可以避免 std::function总而言之,如:
template<typename Func>
void call_func(void *args) {
auto& f = *static_cast<Func*>(args);
f();
}

template<typename Func>
void wrapped_create_task(Func& func) {
CreateTask(call_func<Func>, static_cast<void*>(&func));
}
// you can still use `std::function` here, but you don't have to.
auto f = [&](){
// Any arguments you like here
do_whatever(1, 2, 3)
};

// this works on any object that implements `operator ()`
wrapped_create_task(f)
同样, f 真的很重要在执行期间保持存活。你不能把它放在一个在任务完成之前就消失的堆栈上。

关于c++ - 环绕在 C++ 中使用 void* 接受其参数的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63514460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com