liv*_*hak -1 c pointers function-pointers
我有一个使用函数指针的小程序.
#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;
}
Run Code Online (Sandbox Code Playgroud)
函数指针decleration
void (*callback)(void*);
Run Code Online (Sandbox Code Playgroud)
声明一个callback带有泛型指针并返回void 的函数指针.
在分配cbfunc时callback
callback = cbfunc;
Run Code Online (Sandbox Code Playgroud)
我收到了警告
warning: assignment from incompatible pointer type [enabled by default]
Run Code Online (Sandbox Code Playgroud)
如果我使用以下内容
callback = (void*)cbfunc;
Run Code Online (Sandbox Code Playgroud)
它编译时没有任何警告.我正在使用gcc(4.6.3)并使用CFLAGS编译= -g -O3 -Wall
有人能解释一下这个原因吗?
为什么分配会产生警告?
你有超强的力量:你可以和任何狗交朋友.你被放进一个盒子里面写着"这个盒子里的人可以和任何动物交朋友".然后有人把老虎放在你的盒子里.你今天过得怎么样?
现在你明白为什么作业是一个警告?你有一个方法,声明它可以接受任何指针myst,你把它放在一个框中,说"这个指针指向的函数可以接受指向任何东西的指针".这有潜在危险; 什么阻止该函数指针的用户将指针传递给老虎进入函数?
为什么编译器在出现转换时会抑制警告?
因为这是演员的目的.一个演员操作员意味着"编译器,我知道我正在做的事情是疯狂的危险,但我的意思是这样做,并知道它会起作用,所以停止向我发出关于这种疯狂转换的警告和错误".演员有效地关闭了安全系统.如果这不是你的意思,那就不要写演员了.