我有一个使用函数指针的小程序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _myst
{
int a;
char b[10];
}myst;
void cbfunc(myst *mt)
{
fprintf(stdout,"called %d %s. \n",mt->a,mt->b);
}
int main()
{
/* func pointer */
void (*callback)(void *);
myst m;
m.a=10;
strcpy(m.b,"123");
/* point to callback function */
callback = (void*)cbfunc;
/* perform callback and pass in the param */
callback(&m);
return 0;
}
函数指针解除
void (*callback)(void*);
声明一个函数指针callback
,它接受泛型指针并返回void。
将cbfunc
分配给callback
callback = cbfunc;
我收到了警告
warning: assignment from incompatible pointer type [enabled by default]
如果我使用以下
callback = (void*)cbfunc;
它编译时没有任何警告。我正在使用gcc(4.6.3)并使用CFLAGS编译= -g -O3 -Wall
有人可以解释原因吗?
答案 0 :(得分:8)
将void (*callback)(void *);
更改为void (*callback)(myst *);
,因为这正是您的功能实际所在。
答案 1 :(得分:5)
为什么分配会产生警告?
你有超强的力量:你可以和任何狗交朋友。你被放进一个盒子里面说'#34;这个盒子里的人可以和任何动物结交朋友&#34;。然后有人把老虎放在你的盒子里。你今天过得怎么样?
现在你明白为什么这项任务是一个警告?你有一个方法,声明它可以接受任何指向myst
的指针,你把它放在一个框中,表示&#34;这个指针指向的函数可以接受指向任何东西的指针&#34;。这有潜在危险;是什么阻止该函数指针的用户将指针传递给老虎进入函数?
为什么编译器在出现转换时会禁止警告?
因为这是演员的目的。一个演员操作员意味着&#34;编译器,我知道我正在做的事情是疯狂的危险,但我的意思是这样做,并知道它会起作用,所以停止向我发出有关这种疯狂转换的警告和错误&#34;。演员有效地关闭了安全系统。 如果这不是您的意思,那么就不要写演员。