让我们从一个有关回调函数的示例开始。在许多场景中,客户希望与特定的游戏开发商合作开发游戏项目,但不了解他们的优势,然后向每个开发商寻求指导。我们会要求企业设计其结构、功能等,并投票选出符合要求的企业。首先,我希望我的客户仔细考虑他们编写的代码是否可维护、可读、可扩展、灵活、简洁、可重用、可测试,还有其他问题。面对这样的需求,对于开发人员来说,让回调函数在他们的代码中发挥重要作用,以便编写满足客户需求的代码变得越来越重要。
回调函数的作用:
回调函数是程序开发中非常重要的概念。所谓回调,实际上是不同程序模块之间的接口和协议,是软件层次结构设计的基本方法。回调函数大大提高了编程效率,很多场景开发都有一些需求必须使用回调函数来实现。同时,在C语言中,回调函数只能使用函数指针来实现。例如,C++和其他语言也允许函子和匿名函数。
什么是回调函数?
这里我引用一段网上的一段话,方便理解。
回调函数是一种非常重要的机制,主要用于实现软件中的分层设计。这使得不同软件模块的开发人员的工作进度是独立的,不受时间和空间的限制,只需要达成一致即可。接口(或标准)根据需要进行调整。这就是C++、JAVA等现代编程语言所提倡的所谓面向接口编程。同时回调也是定制软件的基础,通过回调机制将软件的前端和后端分开,前端提供逻辑策略,后端提供逻辑实现。
事实证明,C 语言中的函数实际上是人类的等效函数。给他一些参数,他就会帮你完成同样固定的功能。例如,“假设我给你这个。”厨师说出菜名。 “食物煮熟了,你带病人去看医生,医生治疗病人,等等。我们这里有一名厨师和一名医生。相当于一个函数,有exact函数,等待调用。
我们身边这样的“特色”还有很多,但每次去食堂吃饭都要走很远的路,很麻烦,所以我就托了我们公司前台的同事过来一下。说你想。你吃完饭后我会给你送午餐。然后,在他们出去吃午饭之前,给他们一些参数(比如20元,明确告诉他们你想吃什么,蛋炒饭还是番茄炒饭等)。 30分钟后,同事A办理完付款等手续,带着热气腾腾的饭盒回来了。这一系列的处理就变成了正常的函数调用处理。而你就像是给你的同事打电话,满足了你一直以来的愿望,不用走太远就能坐下来吃顿饭。其流程如下图所示。
当然,这还不够。还有更多的事情要做。
最终,每个人都厌倦了一直在同一家自助餐厅吃饭。最终你决定不能再吃东西了,并决定停止在自助餐厅吃饭并开始自己做饭。这道菜不能一个人完成。否则,讨论这个回调就没有意义了。所以我继续请我的前台同事帮助我完成工作(这似乎是我过度劳累了我的同事)。我总是不好意思请人帮我做事,所以我就很乐意交出一些钱来请人帮忙。他们做工作。
让这位同事去菜市场买你想吃的东西,煮一下,然后给你端上来(就像保姆一样,这只是一个比喻~~)。这位同事看上去很乐意为你服务,跑腿、买菜、讨价还价、给你倒茶送水,但最后却发现他其实不会做饭。无奈之下,我不再打扰同事了。你有钱,有野心,所以你雇了一个只会做饭的高级厨师,你要做的就是给他食材。
这样一来,做饭的过程就显得多余了。只需向您的同事提供菜肴清单和您要花的钱,给他们厨师的电话号码,然后说:买完食物后请拨打这个电话,让厨师准备食物并发送给我。同时,你可以告诉厨师:“厨师,我喜欢深色口味的还是淡口味的?”它变得更轻。它看起来就像下图一样。
为了吃上面提到的那顿来之不易的午餐,还实现了典型的回调机制。如果您自定义Chef,您的同事在您打电话给他们时也会收到您厨师的电话号码,因此他们在做饭时需要它。根据指定的参数(厨师的电话号码)呼叫(回调)厨师,并提供做好的饭菜。
上面照片中最重要的信息之一是,左边的两个人和右边的人之间有一条有意义的虚线。这意味着有左右两组。左边的人负责做饭、吃饭,右边的人则处理差事、谈判等。例如,您只需要知道如何找到同事并将参数传递给他们来完成工作。您不需要知道同事购买的食物来自哪里,无论距离多远或多近。你还需要照顾厨师。我只是想让他做出适合我口味的美味佳肴。不用担心买菜的同事什么时候能找到厨师,或者他们的关系会如何发展。未来。你右边的同事只需按照你的指示,根据需要“回电”厨师,他就不用担心厨师准备的食物好不好,因为食物已经煮熟了。味道由我决定。
因此,上图中左右两个群体各司其职,互不结合,高度独立,但却可以非常方便地合作,形成共识,完成一个繁荣的社会。功能。这里,chef是一个回调函数——,它不是由设计者(你自己)直接调用的,而是由其他人(你的同事)调用的。您给同事的电话号码可以帮助他们找到厨师。这称为“函数指针”。回调机制依靠函数指针来告诉您回调函数的位置。
回调函数怎么写?
我已经解释得很详细了,但我终于明白了什么是回调函数。现在让我们看看如何实现一个简单的回调函数。在代码中演示如何使用回调函数查找数组中的元素。如下:
#define _CRT_SECURE_NO_WARNINGS#include stdio.h#include string.h#include stdlib.h//创建结构体struct arrInfo{char name[64];int Age;};//实现底层函数int printArr(void * arr, int elesize, int len, void * date, int(*arrCompare)(void *, void *)){char * p=arr;for (int i=0; i len; i++) {//每个元素获取开始address of char * arrAddr=p + elesize * i; //用户输入的数据==扫描数组中的元素if (arrCompare(date, arrAddr)) {return 1;}}return 0;自己提供了function int myConfig(void * d1, void * d2){struct arrInfo * p1=d1;struct arrInfo * p2=d2;if (strcmp(p1-name, p2-name)==0 p1-age==p2 -age) {return 1;}else {return 0;}}void test(){ //检查数组中是否存在指定类型的元素,如果存在则设置为1 struct arrInfo arr []={{ ‘你好’, 111 },{ ‘世界’, 222 },{ ‘爱’, 333 },{ ‘中国’, 444 }}; int len=sizeof(arr)/sizeof(struct arrInfo);struct arrInfo p={ ‘World’, 222};int res=printArr(arr, sizeof(struct arrInfo), len, p, myConfig);if (res) {printf(‘在数组中查找元素\n’);}else { printf(‘数组中找不到元素\n’);}}int main() {test();return 0;} 结果是找到这个数组元素如下:如下图中:
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/87190.html