首页 文章详情

回调函数这个是什么鬼?

嵌入式Linux | 196 2022-01-02 01:35 0 0 0
UniSMS (合一短信)

这是一个同学在微信给我提问的问题。


要搞清楚回调函数,我们首先要搞清楚函数,函数其实就是一个地址,这个地址描述了这个函数在内存中的位置。


但是函数和变量也是一样的,有类型,对变量来说,变量会分成各种类型,对函数来说也是一样,函数会有参数和返回值,不同的参数和返回值就描述了不同的函数。


那回调函数呢?


回调函数其实是一个连锁反应,比如你小孩生病了,这会导致你老婆可能不开心,你老婆不开心了,会连锁反应到你也会不开心。


不开心这个信心从你老婆传递到了你身上,你小孩就起到了函数调用的作用。


我们可以写个简单的代码



#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







最后,如果觉得不错,大家顺手点个赞,转发就是对我最大的鼓励和支持!


长按识别二维码关注公众号

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter