什么叫回调函数?

来源:互联网 发布:linux 统计文件夹个数 编辑:程序博客网 时间:2024/05/01 13:59

回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。



生动的描述
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。(by常溪玲)

专业的解释
In computer programming, a callback is a reference to executable code, or a piece of executable code, that is passed as an argument to other code. This allows a lower-level software layer to call a subroutine (or function) defined in a higher-level layer.

数学的定义
是设计模式里面template method pattern当template method的数量无限趋近于一的时候的极限。(by vczh )

通俗易懂的说法
想象你的朋友将要离开你家,走的时候,你告诉对方说“你到家后,给我打个电话,这样我才知道你安全到达了。” 这就是字面上的call back

举例说明
<span style="font-family:Courier New"><span class="co2" style="color:rgb(51,153,51)">#include <stdio.h></span><span class="co2" style="color:rgb(51,153,51)">#include <stdlib.h></span> <span class="coMULTI" style="color:rgb(128,128,128); font-style:italic">/* The calling function takes a single callback as a parameter. */</span><span class="kw4" style="color:rgb(153,51,51)">void</span> PrintTwoNumbers<span class="br0" style="color:rgb(0,153,0)">(</span><span class="kw4" style="color:rgb(153,51,51)">int</span> <span class="br0" style="color:rgb(0,153,0)">(</span><span class="sy0" style="color:rgb(51,153,51)">*</span>numberSource<span class="br0" style="color:rgb(0,153,0)">)</span><span class="br0" style="color:rgb(0,153,0)">(</span><span class="kw4" style="color:rgb(153,51,51)">void</span><span class="br0" style="color:rgb(0,153,0)">)</span><span class="br0" style="color:rgb(0,153,0)">)</span> <span class="br0" style="color:rgb(0,153,0)">{</span>    <span class="kw3" style="color:rgb(0,0,102)">printf</span><span class="br0" style="color:rgb(0,153,0)">(</span><span class="st0" style="color:rgb(255,0,0)">"%d and %d<span class="es1" style="color:rgb(0,0,153); font-weight:bold">\n</span>"</span><span class="sy0" style="color:rgb(51,153,51)">,</span> numberSource<span class="br0" style="color:rgb(0,153,0)">(</span><span class="br0" style="color:rgb(0,153,0)">)</span><span class="sy0" style="color:rgb(51,153,51)">,</span> numberSource<span class="br0" style="color:rgb(0,153,0)">(</span><span class="br0" style="color:rgb(0,153,0)">)</span><span class="br0" style="color:rgb(0,153,0)">)</span><span class="sy0" style="color:rgb(51,153,51)">;</span><span class="br0" style="color:rgb(0,153,0)">}</span> <span class="coMULTI" style="color:rgb(128,128,128); font-style:italic">/* A possible callback */</span><span class="kw4" style="color:rgb(153,51,51)">int</span> overNineThousand<span class="br0" style="color:rgb(0,153,0)">(</span><span class="kw4" style="color:rgb(153,51,51)">void</span><span class="br0" style="color:rgb(0,153,0)">)</span> <span class="br0" style="color:rgb(0,153,0)">{</span>    <span class="kw1" style="color:rgb(177,177,0)">return</span> <span class="br0" style="color:rgb(0,153,0)">(</span><span class="kw3" style="color:rgb(0,0,102)">rand</span><span class="br0" style="color:rgb(0,153,0)">(</span><span class="br0" style="color:rgb(0,153,0)">)</span> <span class="sy0" style="color:rgb(51,153,51)">%</span> <span class="nu0" style="color:rgb(0,0,221)">1000</span><span class="br0" style="color:rgb(0,153,0)">)</span> <span class="sy0" style="color:rgb(51,153,51)">+</span> <span class="nu0" style="color:rgb(0,0,221)">9001</span><span class="sy0" style="color:rgb(51,153,51)">;</span><span class="br0" style="color:rgb(0,153,0)">}</span> <span class="coMULTI" style="color:rgb(128,128,128); font-style:italic">/* Another possible callback. */</span><span class="kw4" style="color:rgb(153,51,51)">int</span> meaningOfLife<span class="br0" style="color:rgb(0,153,0)">(</span><span class="kw4" style="color:rgb(153,51,51)">void</span><span class="br0" style="color:rgb(0,153,0)">)</span> <span class="br0" style="color:rgb(0,153,0)">{</span>    <span class="kw1" style="color:rgb(177,177,0)">return</span> <span class="nu0" style="color:rgb(0,0,221)">42</span><span class="sy0" style="color:rgb(51,153,51)">;</span><span class="br0" style="color:rgb(0,153,0)">}</span> <span class="coMULTI" style="color:rgb(128,128,128); font-style:italic">/* Here we call PrintTwoNumbers() with three different callbacks. */</span><span class="kw4" style="color:rgb(153,51,51)">int</span> main<span class="br0" style="color:rgb(0,153,0)">(</span><span class="kw4" style="color:rgb(153,51,51)">void</span><span class="br0" style="color:rgb(0,153,0)">)</span> <span class="br0" style="color:rgb(0,153,0)">{</span>    PrintTwoNumbers<span class="br0" style="color:rgb(0,153,0)">(</span><span class="sy0" style="color:rgb(51,153,51)">&</span><span class="kw3" style="color:rgb(0,0,102)">rand</span><span class="br0" style="color:rgb(0,153,0)">)</span><span class="sy0" style="color:rgb(51,153,51)">;</span>    PrintTwoNumbers<span class="br0" style="color:rgb(0,153,0)">(</span><span class="sy0" style="color:rgb(51,153,51)">&</span>overNineThousand<span class="br0" style="color:rgb(0,153,0)">)</span><span class="sy0" style="color:rgb(51,153,51)">;</span>    PrintTwoNumbers<span class="br0" style="color:rgb(0,153,0)">(</span><span class="sy0" style="color:rgb(51,153,51)">&</span>meaningOfLife<span class="br0" style="color:rgb(0,153,0)">)</span><span class="sy0" style="color:rgb(51,153,51)">;</span>    <span class="kw1" style="color:rgb(177,177,0)">return</span> <span class="nu0" style="color:rgb(0,0,221)">0</span><span class="sy0" style="color:rgb(51,153,51)">;</span><span class="br0" style="color:rgb(0,153,0)">}</span></span>

回调的作用
回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。

看完后,你觉得还有可补充的内容,欢迎给我留言:)

参考资料
http://stackoverflow.com/questions/824234/what-is-a-callback-function?answertab=votes#tab-top

http://en.wikipedia.org/wiki/Callback_(computer_science)

http://www.zhihu.com/question/19801131

http://wmnmtm.blog.163.com/blog/static/3824571420105484116877/

http://stackoverflow.com/questions/9596276/how-to-explain-callbacks-in-plain-english-how-are-they-different-from-calling-o

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 pdf文件没有打印怎么办 打印机添加不上怎么办 笔记本电脑收不到wifi怎么办 账套输出不了怎么办 无法加载pdf文档怎么办 pdf控件不可用怎么办 扫描件不清晰怎么办 图片大于200k怎么办 手机图片字模糊怎么办 天然气手册丢了怎么办 消消乐登录异常怎么办 新手想学考古怎么办 省份证改名字怎么办 文曲星放太久开不了机怎么办 小狗吃火腿肠皮怎么办 虚火引起的牙痛怎么办 牙髓炎怎么办立刻止疼 小蜜丸吃不下去怎么办 铜钱的字不认识怎么办 古钱币出手好烦怎么办 安装目录不可写怎么办 手机不支持exfat格式怎么办 windows7图标变大了怎么办 igs格式烂曲面怎么办 手机桌面文件夹打不开怎么办 苹果下载不了150怎么办 iphone6速度变慢怎么办 苹果手机微信打不开pdf怎么办 苹果手机打不开pdf怎么办 pdf文件超过了怎么办 pdf电脑删不了怎么办 联想笔记本摄像头横屏调竖屏怎么办 pdf文件打开失败怎么办 pdf复制文字乱码怎么办 电子发票乱码了怎么办 超星尔雅挂了怎么办 电脑应用双击打不开怎么办 电脑控制面板打不开怎么办 转换器无法打开文件怎么办 电脑文件无法打开怎么办 手机上jpg打不开怎么办