簡體   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