C语言中的回调函数

1 什么是回调函数? 首先什么是“回调”呢? 我的理解是:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调。
如果代码立即被执行就称为同步回调,如果过后再执行,则称之为异步回调。
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
2 为什么要用回调函数? 因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。
简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
int callback()    ///< 回调函数{    // todo    return 0;}int main()     ///<  主函数{    // todo    library(callback);  ///< 库函数通过函数指针进行回调    // todo    return 0;} 回调似乎只是函数间的调用,和普通函数调用没啥区别。
但仔细看,可以发现两者之间的一个关键的不同:在回调中,主程序把回调函数像参数一样传入库函数。
这样一来,只要我们改变传进库函数的参数,就可以实现不同的功能,这样有没有觉得很灵活?并且当库函数很复杂或者不可见的时候利用回调函数就显得十分优秀。
3 怎么使用回调函数? int callback_1(int a)   ///< 回调函数1{    printf(hello, this is callback_1: a = %d , a);    return 0;}int callback_2(int b)  ///< 回调函数2{    printf(hello, this is callback_2: b = %d , b);    return 0;}int callback_3(int c)   ///< 回调函数3{    printf(hello, this is callback_3: c = %d , c);    return 0;}int handle(int x, int (*callback)(int)) ///m26工作状态集合函数***********************************************/m26_workstatus_typedef m26_workstatus_tab[] ={        {gprs_network_close,  m26_pwrkey_off  }, //模块关机    {gprs_network_open,  m26_pwrkey_on  }, //模块开机    {gprs_network_start,   m26_work_init  }, //管脚初始化    {gprs_network_conf,  m26_net_config  }, /at指令配置    {gprs_network_link_ctc,  m26_link_ctc  }, //连接调度中心      {gprs_network_wait_ctc, m26_wait_ctc  },  //等待调度中心回复     {gprs_network_link_fem, m26_link_fem  }, //连接前置机    {gprs_network_wait_fem, m26_wait_fem  }, //等待前置机回复    {gprs_network_comm,  m26_comm   }, //正常工作        {gprs_network_wait_sig,  m26_wait_sig  },  //等待信号回复    {gprs_network_getsignal,  m26_getsignal  }, //获取信号值    {gprs_network_restart,  m26_reset   }, //模块重启}/************************************************ >m26模块工作状态机,依次调用里面的12个函数   ***********************************************/uint8_t m26_workstatus_call(uint8_t start){    uint8_t i = 0;    for(i = 0; i < 12; i++)    {        if(start == m26_workstatus_tab[i].mstatus)        {                return m26_workstatus_tab[i].funtion();        }    }    return 0;} 所以,如果有人想做个nb模块联网项目,可以copy上面的框架,只需要修改回调函数内部的具体实现,或者增加、减少回调函数,就可以很简洁快速的实现模块联网。

微软:4月将推出全新一代的Surface Laptop 4
东大金智科技40GBASE-SR4 300m FTL410QD3C模块介绍英文版
今年上半年全球手机CIS传感器出货量20亿,SK海力士第三季度亏损大幅收窄
工业人的思维方式与学术界差别很大
ESD静电保护器在Microphone接口的保护应用
C语言中的回调函数
南北同启 | 美格智能多款5G+AIoT模组及解决方案亮相北京通信展与深圳电子展
镭神智能首次攻破国产激光雷达矿区无人驾驶应用难题——让灰尘“隐形”,不再遮“眼”
高温露点仪怎么应用
华为终于开始了摒弃安卓的计划
7月份4Kx2K电视面板出货成长近一倍
总结几点防止电路失效的注意事项
【宜百利】双十二虽过,但活动仍在继续
深圳市创物联网生物安全科技生态品牌
刀具破损的声发射传感监测新技术
嘉兴12英寸大硅片项目实在太低调
电脑硬盘坏了的症状
感应同步器的信号处理
航空航天和国防移动化永不满足的带宽应用
领跑OpenHarmony富设备产业化!润和DAYU200通过OpenHarmony兼容性测评