繁体   English   中英

如何将 void* 转换为函数指针?

[英]How to cast void* to a function pointer?

我在 FreeRTOS 中使用 xTaskCreate,它的第四个参数 (void * const) 是传递给新线程调用的函数的参数。

void __connect_to_foo(void * const task_params) {
   void (*on_connected)(void);
   on_connected = (void) (*task_params);
   on_connected();
}

void connect_to_foo(void (*on_connected)(void)) {
   // Start thread
   xTaskCreate(
         &__connect_to_foo,
         "ConnectTask",
         STACK_SIZE,
         (void*) on_connected, // params
         TASK_PRIORITY,
         NULL // Handle to the created Task - we don't need it.
         );
}

我需要能够传入带有签名的函数指针

无效栏();

但我不知道如何将 void* 转换为我可以调用的函数指针。 我能得到的最接近的是:

错误:'void*' 不是第 3 行的指针对象类型

如何将 task_params 转换为可以调用的函数指针?

注意上面的代码被大大简化了。

这些方面的东西:

typedef void (*OnConnected_t)();
OnConnected_t on_connected = OnConnected_t(task_params);
on_connected();

有一个直接投射的便携式替代方案。 指向函数指针的指针本身就是数据指针。 也就是说,给定auto connect_to_foo_ptr = &__connect_to_foovoid* ptr = &connect_to_foo_ptr在任何地方都是合法的。

当然,要调用它,您需要将void*转换回void (**)(void * const task_params) ,并取消引用它两次。 第一次取消引用让您返回函数指针,第二次让您获得原始函数。

这里的一个限制是您需要确保connect_to_foo_ptr不会超出范围,但这通常不是问题。 您通常可以将其static ,但即使是常见的回调模式也不需要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM