回调函数
回调函数就是函数指针的一种用法
函数指针是一个给其它函数预留的一个接口,只有符合这个接口定义的函数,不论你在函数里实现了什么,都可以。
回调函数是什么
在网上看了好多例子,以下这两个例子给我留下的印象最深:
诸葛亮给赵子龙一个锦囊,吩咐他危急时打开按锦囊指示办, 锦囊里的命令就是回调函数,危急时刻就是回调的时机。
不同的锦囊里可以有不同的命令。
你想寄包裹,肯定要留下自己的联系方式和地址吧(相当于回调函数的地址)。然后开始打电话给快递,但快递不会马上来取件,而是通过你留下的联系方式和地址,在他有空或顺路的时候来联系你取件。在送包裹的过程中,服务好的话快递会在你包裹快递状态变化的各个环节通知你(比如已经送到分拣中心,由中心分发开始投递,到达对方所在城市,对方已经签收)。
就是主模块需要一个参数,但这个参数有些特别,特别之处在于,参数不能完全由外部数据来给出。必须要与主模块协作才能得到,所以在该处设置一个叫回调函数的东西,让他实现的功能是:主模块给出内部参数,通过指针调用外部子模块,而外部子模块这需要主模块的参数为传入参数,作用后得到的值在返回给主模块。说白了就是主模块给你子模块一袋面粉,然后子模块进加工成馒头后有返回给主模块。在详细一点就是:主模块通过指针找到子模块(馒头作坊),然后把面粉送过去,最后得到馒头,返回来。
举例:一个很简单的回调函数。
#include <stdio.h>
void printWelcome(int len)
{
printf("欢迎欢迎 -- %d\n", len);
}
void printGoodbye(int len)
{
printf("送客送客 -- %d\n", len);
}
void callback(int times, void (*print)(int))
{
inti;
for(i = 0; i < times; ++i)
{
print(i);
}
printf("/n我不知道你是迎客还是送客!\n\n");
}
void main(void)
{
callback(10,printWelcome);
callback(10,printGoodbye);
printWelcome(5);
}
callback函数为B层,main函数和print*函数为A层,A层调用了B层的回调函数callmeback,而B层的回调函数调用了A层的实现函数print*。说白了B层就是一个接口。
为什么要使用回调函数?
因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。把具体操作和选择操作的代码分开是一种良好的设计方法,更为复杂的操作将肯定以独立的函数来实现,因为它们的长度可能很长。