深入浅出回调函数

1 篇文章 0 订阅
1 篇文章 0 订阅

近来,由于在项目推进过程中遇到些问题,或者说是先前自己一直对这类问题的半知半解阻挠了项目的进展,于是对回调函数作了些研究,算是有些个人心得,写出来与各位分享。
1. 概念简述
回调函数,简而言之,就是写在上层供下层 调用的函数。
这里的上层/下层,一种直观的理解是,上层就是我们写的程序,下层即系统API。
另一个更一般的理解,上层为调用者程序,下层为被调用者程序。

2. 回调函数机制
回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括全局函数、OOP中的对象等)时,将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象。这个函数 是调用者和被调用者之间的一种通知约定,当约定的事件发生时,被调用者(一般会包含一个工作线程)就会按照这个函数 地址调用该函数。
这里提到的"这个函数 ",即回调函数。一言以蔽之,被调用者 回头调用调用者 的函数称为回调(callback)函数

3. 回调函数示例
3.1. 使用回调函数的缘由

大家知道,排序算法在程序中经常会用到,为做到代码重用,我们可以编写一个排序算法库 (如直接插入排序/shell排序; 冒泡排序/快速排序; 简单选择排序/堆排序; 归并排序; 基数排序等)。
考虑到算法的通用性 (既可排序int数据,也可排序string数据,甚至是datetime数据,即不管数据类型如何都可以用之),我们当然不想在排序函数中嵌入基于数据类型的比较代码,那该怎么实现呢?在面向对象领域,基于语言机制的支持,C++提供了标准模板库(STL), Java也提供了泛型支持。在面向过程领域,在功能强大的C语言里,我们又该怎么实现呢?一般的做法就是使用函数指针,并进行函数回调。

3.2. 基于回调函数的排序算法实现思路
具体实现思路 是,在排序函数(如quickSort)参数列表中列一个函数地址(回调函数地址),并让调用者实现一个比较函数(回调函数),其中包含两个指针类参数,该比较函数用以比较此二指针所指数据之大小,并由函数返回值说明比较结果。

3.3. 基于回调函数的排序算法具体实现
快速排序quickSort的函数原型为:

其中,各参数含义:
array :待排序数组首元素起始地址
elemSize :待排序数组元素的大小
low :待排序数组待排序段的首元素索引
high :待排序数组待排序段的末元素索引
cmpFunc :比较函数地址
快速排序quickSort的函数为:

对算法的使用者来说,须提供一个比较元素值大小的函数(回调函数),其地址传递给quickSort ()以供其回调。下面给出二个简单的比较函数实现,一个比较两个整数,另一个比较两个字符串:

 


下面给出主调程序,用于测试上述代码:

3.4. 基于回调函数的排序算法完整代码

4. 总结
察看上述排序函数quickSort()的实现,以及主调程序对quickSort()的调用过程,不难发现,排序函数(被调用者,处下层 )借此调用者 (用户程序, 处上层 )提供的比较函数(回调函数 )来比较大小,借指针传递参数 ,可以全然不管所比较的数据类型,带来编程上的极大灵活性。
上述调用及回调过程可用下图总括:

5. 参考网文:
[上层_底层概念]http://tech.e800.com.cn/articles/2009/819/1250659444349_1.html
[2楼比喻(家政工-家长__程序-Windows:上层_底层)]http://bbs.eyuyan.com/dispbbs.asp?boardid=124&id=23620&page=0&star=1
[2楼1语道破(App-Windows:上层_底层)_3楼一针见血]http://tech.techweb.com.cn/redirect.php?fid=10&tid=349110&goto=nextnewset
[1段_回调函数机制]http://hi.baidu.com/davidjkl/blog/item/8768e08bc956b77a9e2fb48b.html
[4楼排序函数回调思想] http://topic.csdn.net/t/20021228/10/1307383.html
[冒泡排序函数示例]http://hi.baidu.com/spidermanzy/blog/item/b25b00956469c6097bf48016.html

--By Qsinzheng, 2010-06-08

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值