关于回调函数的本质及比喻和实例分析
2015-11-08 22:57
295 查看
#include <iostream> using namespace std; typedef void (*PF)(); void func() { cout << "func" << endl; } void caller( PF pf) { pf(); } int main() { PF p = func; caller(p); system("pause"); return 0; }
回调函数。高层调用了底层,底层反过来回调了顶层。lib用的是指针。回调函数是最终被调用的那个。
https://www.zhihu.com/question/19801131
来源2
链接:http://www.zhihu.com/question/19801131/answer/13005983
来源:知乎
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。回答完毕。
code和data本质是一样的东西。调用指针和调用数据一样的
来源1
链接:http://www.zhihu.com/question/19801131/answer/17156023
来源:知乎
来到这里,其实已经没有什么好说的了。回调函数也就是是A让B做事,B做着做着,信息不够,不知道怎么做了,就再让外面处理。
比如排序,A让B排序,B会做排序,但排序需要知道哪个比哪个大,这点B自己不知道,就需要A告诉它。而这种判断那个大,本身是一种动作,既然C语言中不可以传进第一值的函数,就设计成传递第二值的函数指针,这个函数指针就是A传向B的信息,用来表示一个行为。这里本来A调用B的,结果B又调用了A告诉它的信息,也就叫callback。
自己总结
main调用了caller这个函数。但是caller用了main的p指针。p为回调函数。main调用了caller,但是caller执行中发现东西不够,又回访main中的func。这就叫回调。你去店里买东西。电话为回调函数。你调用了店员,店员后来发现有货了但是信息不够,就用回调函数电话号码响应了你原来的东西。
回调函数可以把调用者和被调用者分开,调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。
main不用知道caller调用了谁,main不知道func,他只是知道形式就好。
dll也是一种回调机制。
CALLBACK VOID callback_fun(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { TRACE("CallBack\n");//debug下运行控制台输出CallBack } void CTestCallBackDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 SetTimer(1,1000,(TIMERPROC)callback_fun);//每一秒回调一次 }
这个代码段里首先定义回调函数,然后定义一个被调用函数。主调函数是系统,也就是鼠标点击的时候。这样本质还是系统调用了回调函数。
如何调用
使用回调函数,我们需要做三件事:
声明
定义
设置触发条件:在你的函数种把你的回调函数名称转化为地址作为一个参数,以便于系统调用。
声明和定义时应注意,回调函数由系统调用,所以可以认为它属于windows系统,不要把它当作你的某个类的成员函数。
回调函数是一个程序员不能显示调用的函数,通过将回调函数的地址传给调用者从而实现调用。回调函数是十分必要的,在我们想通过一个统一接口实现不同的内容,这时回调函数非常合适。
相关文章推荐
- [原创]java局域网聊天系统
- FREEBASIC 编译可被python调用的dll函数示例
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Windows 系统组策略应用全攻略(下)第1/3页
- DLL(Dynamic Linkable Library) 详解说明
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- delphi中一个值得大家来考虑的DLL问题
- ASP下经常用的字符串等函数参考资料
- 如何进行系统配置
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例