这是一个同学在微信给我提问的问题。
要搞清楚回调函数,我们首先要搞清楚函数,函数其实就是一个地址,这个地址描述了这个函数在内存中的位置。
但是函数和变量也是一样的,有类型,对变量来说,变量会分成各种类型,对函数来说也是一样,函数会有参数和返回值,不同的参数和返回值就描述了不同的函数。
那回调函数呢?
回调函数其实是一个连锁反应,比如你小孩生病了,这会导致你老婆可能不开心,你老婆不开心了,会连锁反应到你也会不开心。
不开心这个信心从你老婆传递到了你身上,你小孩就起到了函数调用的作用。
我们可以写个简单的代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>void func(void *f(int),int parm)
{f(parm);
}void call_back(int parm)
{printf("%s(),LINE=%d,args=%d\n",__FUNCTION__,__LINE__,parm);
}int main(void)
{func(call_back,123);return 0;
}
代码运行
$main
call_back(),LINE=12,args=123
从项目角度上看,callback是一个人实现,然后func里面会是另一个人实现,我们在main里面会把回调的指针注册给func,等某个时机成熟的时候,func就会调用这个指针来做它想做的事情。
但是从C语言和计算机角度出发,函数无非就是一个地址,我们传递的是一个地址,后面我们只是用了这个地址来做了我们想做的事情。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>typedef void (*type_func)(int);void func(u_int64_t* ptr,int parm)
{((type_func)ptr)(parm);
}void call_back(int parm)
{printf("%s(),LINE=%d,args=%d\n",__FUNCTION__,__LINE__,parm);
}int main(void)
{func((u_int64_t*)call_back,123);return 0;
}
这段代码里面的信息就会比较多了,一个是用了typedef来修饰一个函数指针的类型,然后我们在传call_back的时候,强制让它变成了一个地址,之后拿到这个地址后,再让它变成一个函数。
写这个demo的意思就是想让大家知道,函数名,其实不过是一个地址,但是,地址只是单纯的地址,没有多的含义,所以我们需要给地址加上类型,这才是有意义的。
一个人是没有意义的,一个人做的事情,才会让这个人的人生有意义。
$gcc -o main *.c -lm
$main
call_back(),LINE=14,args=123
最后,如果觉得不错,大家顺手点个赞,转发就是对我最大的鼓励和支持!
长按识别二维码关注公众号