如何正确地将指针分配给回调函数?

How can I correctly assign a pointer to a call back function?

我尝试用 C 在 IRQ 中调用一个函数,我得到了下一个代码。

static void (*functionPulsacion)();

void eint2_init(void *funcPulsacion){
    functionPulsacion = funcPulsacion;
}

但是当我在 Keil 中编译时 IDE 显示下一条消息:

Button2.c(38): warning: #513-D: a value of type "void *" cannot be assigned to an entity of type "void (*)()"

这样做的好方法是什么?

提前致谢

确保 funcPulsacion 的类型与 functionPulsacion 的类型匹配,例如:

static void (*functionPulsacion)(void);

void eint2_init(void (*funcPulsacion)(void)) {
    functionPulsacion = funcPulsacion;
}

使用typedef定义函数指针类型有助于重复使用:

typedef void (*functionPulsacion_type)(void);

static void functionPulsacion_type functionPulsacion;

void eint2_init(functionPulsacion_type funcPulsacion) {
    functionPulsacion = funcPulsacion;
}

参数变量的语法与静态变量的语法相同。

static void (*functionPulsacion)(void);

void eint2_init(void (*funcPulsacion)(void)) {
    functionPulsacion = funcPulsacion;
}

不过,Typedef 使函数指针更具可读性。

typedef void (*PulsacionFunc)(void);

static PulsacionFunc pulsacion_func;

void eint2_init(PulsacionFunc a_pulsacion_func) {
   pulsacion_func = a_pulsacion_func;
}

这是指向可变参数函数的指针类型 returns void

static void (*functionPulsacion)();

然而,这个函数的参数是void *

void eint2_init(void *funcPulsacion){
    functionPulsacion = funcPulsacion;
}

有趣的是,对于任何数据指针,您可以分配一个void *而没有任何问题

void foo(void *vp)
{
    int *ip = vp;
}

void bar(void *vp)
{
    char *cp = vp;
}

但是根据标准,不是函数指针

void nope(void *vp)
{
    void (*fp)() = vp; // this might be a problem!
}

任何数据指针都可以转换为 void * 然后再转换回来,甚至没有警告。 但那是 data 指针;不是函数指针。我相信 POSIX 这么说 您可以在 void * 和函数指针之间赋值,但 C 标准不能。

不过,您可以在函数指针之间转换。

当然,那很危险,因为一旦你调用了这个函数,它就不关心什么了 你认为它有的类型;它会根据它所知道的类型来做它的事情。 所以,这里最好只使用正确的指针类型。

void yeah(void (*arg)())
{
    void (*fp)() = arg;
}