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

时间:2018-07-02 02:51:20

标签: c++ function-pointers freertos

我在FreeRTOS中使用xTaskCreate,其第4个参数(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 bar();

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

  

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

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

注意,上面的代码已大大简化。

2 个答案:

答案 0 :(得分:7)

遵循以下原则:

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

答案 1 :(得分:1)

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

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

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