如何正确地将指针分配给回调函数?
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;
}
我尝试用 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;
}