gpt4 book ai didi

C void* 函数指针参数

转载 作者:太空宇宙 更新时间:2023-11-04 07:06:39 25 4
gpt4 key购买 nike

我正在尝试在 ARM 中创建一个任务队列。基本思想如下。

typedef void (*funcpointer)(void *);     // the argument being passed will be a void pointer that I can hopefully typecast

struct sQueue{
funcpointer func_address; // this stores the address of the function to be called
void *func_parameter; // this stores the address of the struct that is passed to the function
uint32_t TimeStamp; // the time at which the function should be called
};

sQueue Func_List[10];

计划是能把应该调用的函数的地址放到Func_List[x].func_address中。

我希望能够将接受指向不同结构类型的指针的函数的地址放在 func_address 中。这是一个例子:

void Config_ADC(sADC_Settings *pSettings);

void Enable_RX(sRX_Top_Settings *pSettings);

这两个函数都有效地接受一个指向结构的 32 位指针,但在这些情况下,结构的类型不同。

当我尝试分配 Func_List[x].func_address = Config_ADC 时,编译器会提示:

不能将“void (*)(sADC_Settings *)”类型的值分配给“funcpointer”类型的实体

关于如何实现此目标的任何想法?我当然可以更改函数 Config_ADC 以接受 void* 指针,然后在函数内部对其进行类型转换,但我真的不想那样做。

最佳答案

IIRC 通过具有不同签名的函数指针调用函数是 UB。

每个不匹配的函数类型都需要一个代理函数。

void Config_ADC(sADC_Settings *pSettings);
void Config_ADC_proxy(void *pSettings){
Config_ADC((sADC_Settings*) pSettings);
}

关于C void* 函数指针参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32437069/

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