回调函数函数到底在干什么啊?

时间:2022-08-01 01:01:13

接触C/C++编程已经有不短的时间了,但是对回调函数的理解总感觉不得要领,经过和同学们的讨论之后感觉好像有那么点意思了,写写。

其实回调函数本质是一个函数指针,也就是一个指向函数的指针(请联想变量指针,如int *a)。回调函数一般不是直接调用,而是由另一个函数调用,也就是把回调函数作为一个参数传递给另一个函数。

既然有回调函数,那回调函数的作用是什么呢?其存在的意义在哪里?

要回答这两个问题,请允许我举一个简单的例子。

例子:考虑一个简单的冒泡排序,它的核心就是不断的对两个数进行比较,然后把大的一个或是小的一个送到前面去。这个时候我们需要比较两个元素的大小是吧,好,我们暂时把这个元素的类型定为int。假定有两个int类型的数,a,b。我们怎么比较它的大小呢?很简单,if(a>b)就搞定了。让我们在往前走一点,我们知道,我们每个人都有名字,如果你手上有一份名单,上面有不同人的名字,每个名字总有一个序号吧,这个序号要怎么定呢?还是要排序对不对,我们把这些名字“从大到小”(或相反)排序就可以了。好了,现在涉及到一个问题,一个名字要怎么比较大小呢?嗯,就按照拼音的字母顺序来吧,好,我们从一个人的名字的第一个字母开始,一个一个比,谁靠前谁大。咦,这个过程似乎不是一个>就可以搞定了。嗯,这样我们干脆定义一个函数吧,就是compare(char a[],char b[]), a[],b[]里面分别装的是不同人的名字,里面怎么比的我就不说啦,因为对后面的内容影响不大。这时你会想,既然compare已经添加进来了,那么最初的那个冒泡排序还需要重新写吗?但是里面除了比较大小好像其它都没变啊,重新写是不是有点麻烦啊?其实,设计C/C++的前辈们早就考虑到了这个问题了,在编程的时候有一个很重要的原则-DRY原则,就是don't repeat yourself。这个时候指针函数就闪亮登场了。我们知道,指针函数可以作为一个参数传递给另外一个函数,那么传不同的比较函数(来比较不同类型数据的大小),我们就可以对不同类型的数据进行排序,而不用改变排序函数(我们这里举的冒泡排序),怎么样?是不是非常方便?

讲完了这个例子再回到我们原来的问题,回调函数到底有什么作用呢?从名字我们可以看出,这个函数应该是被其它函数调用的,这让我们想起了指针函数。而回调函数本质上就是指针函数。

要理解回调函数,找一个合适的场景是有益的。我们知道,Windows程序是消息/事件驱动的。当某个事件发生时,Windows会发送某个消息给特定的程序,让该程序执行特定的操作。我们知道,操作系统肯定有其特定的运行规律,我们不可能像写51程序一样,写个while循环来让Windows执行某个命令对吧?为了让其他人也能够在Windows上开发自己的程序,完成自己想要的功能,Windows的设计者们给Windows程序开发者留下了一个借口,这个接口就是一个指针函数。所以,如果你想要在Windows上实现你的程序,你就需要调用这个接口,也就是回调函数。

讲到这里基本就能够说明回调函数的来历了。也就是说,回调函数的实现者,是Windows开发人员,而调用者是Windows操作系统,所以叫做回调函数。

哈哈,终于写完了,尽是些口水话,见谅见谅。