1 什么是回调函数?
来自公众号:C语言与cpp编程
首先什么是“回调”呢?
我的理解如下。如果你将一段可执行代码传递给其他代码,比如参数传递,这段代码就会在特定的时刻被调用并执行。这称为回调。
如果代码立即执行,则称为同步回调。如果稍后执行,则称为异步回调。
回调函数是通过函数指针调用的函数。当你将一个函数指针(地址)作为参数传递给另一个函数并使用这个指针来调用所指向的函数时,它被称为回调函数。
回调函数不是由函数的实现者直接调用,而是由另一方在发生特定事件或条件时调用并响应该事件或条件。
2 为什么要用回调函数?
主叫和被叫可以分离,主叫不必担心被叫是谁。您只需要知道有一个具有特定原型和约束的被调用函数即可。
换句话说,回调函数允许您将要调用的方法的指针作为函数的参数传递给函数,从而使函数在处理类似事件时可以灵活地使用不同的方法。
intCallback()///回调函数{//TODOreturn0;}intmain()///主函数{//TODOLibrary(Callback);///通过函数指针回调库函数//TODOreturn0;} 函数之间没有回调调用与常规函数调用不同。
但如果你仔细观察,你会发现两者之间的重要区别。在回调中,主程序将回调函数像参数一样传递给库函数。
你不觉得只要改变传递给库函数的参数就可以实现各种功能吗?此外,当库函数复杂或不可见时,使用回调函数非常好。
3 怎么使用回调函数?
intCallback_1(inta)///回调函数1{printf(‘Hello,thisisCallback_1:a=%d’,a);return0;}intCallback_2(intb)///回调函数2{printf(‘Hello,thisisCallback_2:b=% d’,b);return0;}intCallback_3(intc)//回调函数3{printf(‘Hello,thisisCallback_3:c=%d’,c);return0;}intHandle(intx,int(*Callback)(int)) ///这里使用的函数指针定义{Callback(x);}intmain(){Handle(4,Callback_1);Handle(5,Callback_2);Handle(6,Callback_3);return0;} 如下。上面的代码:可以看到,在main()函数中调用Handle()函数时,Handle()函数的参数为函数名Callback_1()/Callback_2()/Callback_3。 ()通过。在这种情况下,函数名称是指向相应函数的指针。所以回调函数实际上是函数指针的使用。
4 回调函数实例(很有用)
一个GPRS模块联网的小项目。使用过的同学可能都知道,实现2G、4G、NB等模块的无线联网功能需要经历模块的上电初始化步骤。网络注册、网络信息质量查询、服务器连接示例使用状态机函数(根据不同状态依次调用不同实现方法的函数),通过回调函数依次调用不同的函数来实现。模块联网功能包括:
/************工作状态处理************/typedefstruct{uint8_tmStatus;uint8_t(*Funtion)(void);//函数指针格式}M26_WorkStatus_TypeDef;//工作M26状态收集调用函数/************************************************ ****** * ** ***M26运行状态聚合功能******************************** **** ** ******/m26_workstatus_typedefm26_Workstatus_tab [{{gprs_network_close, m26_pwrkey_off} , M26_pwrkey_on}, //启动模块{gprs_network_start, m26_work_init}, //引脚初始化{gprs_network_conf, m 2 6_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_tM26_WorkStatus_Call(uint8_tStart){uint8_ti=0;for(i=0;i12;i++){if(Start==M26_WorkStatus_Tab [i].mStatus){returnM26_WorkStatus_Tab[i].Funtion();}}return0; 因此,如果要创建NB模块联网项目,只需复制上面的框架即可。里面的执行。通过添加或减少回调函数,您可以非常轻松、快速地实现模块联网。
推荐阅读
C/C++函数指针和指针函数
C语言指针详解
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/87171.html