《C语言函数指针之回调函数及其应用场景.docx》由会员分享,可在线阅读,更多相关《C语言函数指针之回调函数及其应用场景.docx(5页珍藏版)》请在优知文库上搜索。
1、1什么是回调函数?首先什么是“回调呢?我的理解是:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调。如果代码立即被执行就称为同步回调,如果过后再执行,则称之为异步回调。回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。2为什么要用回调函数?因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条
2、件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。主函数Call库函数intCalIbackOUK回调函数/TODOreturn0;intmain()/主函数TODO1.ibrary(Callback);HK库函数通过函数指针进行回调/TODOreturn0;回调似乎只是函数间的调用,和普通函数调用没啥区别。但仔细看,可以发现两者之间的一个关键的不同:在回调中,主程序把回调函数像参数一样传入库函数。这样一来,只要我们改变传进库函数的参数,就可以实现不同的功能,这样有没有觉得很灵活?并且当库函数很复
3、杂或者不可见的时候利用回调函数就显得十分优秀。3怎么使用回调函数?intCallback_l(inta)/回调函数1printf(,Hello,thisisCallback_l:a=%d”,a);return0;intCallback_2(intb)/V回调函数2printf(,Hello,thisisCallback_2:b=%d,b);return0;intCallback_3(intc)/回调函数3printf(Hello,thisisCallback_3:c=%d,c);return0;intHandle(intx,int(*Callback)(int)/M26工作状态集合函数M26_
4、WorkStatus_TypeDefM26_WorkStatus_Tab=GPRS_NETWORK_CLOSE,M26_PWRKEY_Off,模块关机GPRS-NETWORK-OPEN,M26_PWRKEY_On,模块开机GPRS_NETWORK_Start,M26_WorkJnit,/管脚初始化,/连接调度中心), 等待调度中心回复),/连接前置机,/等待前置机回复GPRS-NETWORK-CONF,M26_NET_Config,/AT指令配置GPRS_NETWORK_LINK_CTC,M26_LINK_CTCGPRS_NETWORK_WAIT_CTC,M26_WAIT_CTCGPRS_NE
5、TWORK_LINK_FEM,M26_LINK_FEMGPRS_NETWORK_WAIT_FEM,M26_WA1T_FEMGPRS_NETWORK_COMM,M26.COMM),正常工作GPRS_NETWORK_WAIT_Sig,M26_WAIT_Sig,等待信号回复GPRS_NETWORK_GetSignal,M26_GetSignal,获取信号值GPRS_NETWORK_RESTART,M26_RESET,模块重启1*M26模块工作状态机,依次调用里面的12个函数uint8_tM26_WorkStatus_Call(uint8_tStart)uint8_ti=O;for(i=0;ionEv
6、ent();这些场景只是回调函数在C+中的一部分应用示例,实际上,回调函数是一种灵活的编程模式,可以根据具体需求在各种情境中使用。回调函数使得程序具有更好的扩展性和可维护性,同时提高了代码的模块化和复用性。c+回调函数的使用java的实现方式java的回调函数可能都不陌生,使用接口interface的方式,在接口中定义回调函数。函数参数可以是interfance。调用函数的时候,实现这个interface的函数即可。简单示例:publicinterfaceCallBackpublicvoidexecute();)publicvoidtest(CallBackcallBack)System.ou
7、t.println(callback);callBack.execute();test(newCallBack()Overridepublicvoidexecute()System.out.println(callbackimplement););c+的实现c+是通过函数指针(c的语法)和std:function(c+ll里面的语法)来实现的。c+回调函数的使用场景有下面几种:回调函数是普通函数回调函数的使用场景一般是,一个函数中最后产生一个结果,该函数不再去管这个结果后续的使用,而使用回调函数进行处理。可以先定义好回调函数的函数指针,一般格式:返回值(*指针名)(参数列表)typedefvo
8、id(*CaptureCallback)(string);voidcapturePic(CaptureCallbackcallback)stringt=apicn;callback(t);voidrenderPic(stringt)print(t);)capturePic(renderPic);上面就是一个简单的例子,在捕获图片的函数里面使用渲染图片的回调函数。回调函数是成员函数在c+面向对象里面,回调函数是成员函数的情况更常见,这样的好处是,一个类A的一个函数生成一个结果之后,可以调用另一个类B的成员函数。而不必类A拥有B的实例。尤其是在B中有了A的实例的情况下,A中如果再包含B的实例会出现
9、循环引用的问题,这也是可以解决的,但是这种耦合还是容易让逻辑变得混乱。typedefstd:functionCaptureCallback;classCaptureControllerpublic:CaptureCalIbackcallback;CaptureController(CaptureCallbackCallback):CailbaCk(CalIbaCk);voidcapturePic(CaptureCallbackcallback)stringt=,apiccallback(t);classUI开始捕捉图像voidStartCaptureOCaptureControIlerc(std:bind(&UI:renderPic,this,_i);c.capturePic();演染图片作为回调函数voidrenderPic(stringt)print(t);)main.cppUIui;ui.StartCaptureO;上面的例子就很好的说明了为什么需要回调函数,以及回调函数是如何使用的。在Ul的类中已经引用了CaPtUreCO