📄 什么叫回调函数? - 游戏技术专栏 - csdnblog.htm
字号:
<DIV class=newsItem>欢迎您的到来! </DIV>
<DIV id=mystats><!--done-->
<DIV class=blogStats>原创 - 19, 翻译 - 0, 转贴 - 24, 点击 - 3102, 评论 - 24, Trackbacks -0
</DIV></DIV><SPAN id=RecentVisitors>
<H3 class=listtitle>最近访客</H3>
<TABLE border=0>
<TBODY>
<TR>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'pengxin_hyq')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="pengxin_hyq 的头像" src=""><BR><A title="访问时间: 8/3/2007 11:19:18 PM"
href="http://blog.csdn.net/pengxin_hyq/">pengxin_hyq</A></TD>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'qiufeng2008')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="qiufeng2008 的头像" src=""><BR><A title="访问时间: 8/3/2007 4:25:11 PM"
href="http://blog.csdn.net/qiufeng2008/">qiufeng2008</A></TD></TR>
<TR>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'zhaorui56')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="zhaorui56 的头像" src=""><BR><A title="访问时间: 8/1/2007 3:47:24 PM"
href="http://blog.csdn.net/zhaorui56/">zhaorui56</A></TD>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'wdzr_826')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="wdzr_826 的头像" src=""><BR><A title="访问时间: 8/1/2007 12:56:24 PM"
href="http://blog.csdn.net/wdzr_826/">wdzr_826</A></TD></TR>
<TR>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'miloshanghai')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="miloshanghai 的头像" src=""><BR><A title="访问时间: 7/31/2007 11:50:22 AM"
href="http://blog.csdn.net/miloshanghai/">miloshanghai</A></TD>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'wqs6')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="wqs6 的头像" src=""><BR><A title="访问时间: 7/30/2007 1:56:50 PM"
href="http://blog.csdn.net/wqs6/">wqs6</A></TD></TR>
<TR>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'hellokilly')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="hellokilly 的头像" src=""><BR><A title="访问时间: 7/30/2007 9:34:58 AM"
href="http://blog.csdn.net/hellokilly/">hellokilly</A></TD>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'bigwuke')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="bigwuke 的头像" src=""><BR><A title="访问时间: 7/28/2007 3:52:02 PM"
href="http://blog.csdn.net/bigwuke/">bigwuke</A></TD></TR>
<TR>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'laofuxing')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="laofuxing 的头像" src=""><BR><A title="访问时间: 7/27/2007 10:21:16 PM"
href="http://blog.csdn.net/laofuxing/">laofuxing</A></TD>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'hotdust')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="hotdust 的头像" src=""><BR><A title="访问时间: 7/26/2007 7:23:10 PM"
href="http://blog.csdn.net/hotdust/">hotdust</A></TD></TR></TBODY></TABLE></SPAN>
<H3 class=listtitle>文章</H3>
<UL class=list>
<LI class=listitem><A
href="http://blog.csdn.net/Gamesoftboy/category/279351.aspx">程序设计</A><A
href="http://blog.csdn.net/Gamesoftboy/category/279351.aspx/rss">(RSS)</A>
<LI class=listitem><A
href="http://blog.csdn.net/Gamesoftboy/category/286429.aspx">工具应用</A><A
href="http://blog.csdn.net/Gamesoftboy/category/286429.aspx/rss">(RSS)</A>
<LI class=listitem><A
href="http://blog.csdn.net/Gamesoftboy/category/279350.aspx">图形图像</A><A
href="http://blog.csdn.net/Gamesoftboy/category/279350.aspx/rss">(RSS)</A>
<LI class=listitem><A
href="http://blog.csdn.net/Gamesoftboy/category/286716.aspx">我的历程</A><A
href="http://blog.csdn.net/Gamesoftboy/category/286716.aspx/rss">(RSS)</A>
<LI class=listitem><A
href="http://blog.csdn.net/Gamesoftboy/category/286376.aspx">知识积累</A><A
href="http://blog.csdn.net/Gamesoftboy/category/286376.aspx/rss">(RSS)</A></LI></UL>
<H3 class=listtitle>收藏</H3>
<UL class=list></UL>
<H3 class=listtitle>相册</H3><!--category title-->
<UL class=list>
<LI class=listitem><A
href="http://blog.csdn.net/Gamesoftboy/Gallery/312448.aspx">在山科大最后的日子里</A></LI></UL>
<H3 class=listtitle>存档</H3>
<UL class=list>
<LI><A
href="http://blog.csdn.net/Gamesoftboy/archive/2007/07.aspx">2007年07月(18)</A>
<LI><A
href="http://blog.csdn.net/Gamesoftboy/archive/2007/06.aspx">2007年06月(12)</A>
<LI><A
href="http://blog.csdn.net/Gamesoftboy/archive/2007/05.aspx">2007年05月(3)</A>
<LI><A
href="http://blog.csdn.net/Gamesoftboy/archive/2007/04.aspx">2007年04月(6)</A>
<LI><A
href="http://blog.csdn.net/Gamesoftboy/archive/2007/03.aspx">2007年03月(4)</A></LI></UL></DIV></DIV>
<DIV id=centercontent><!--done-->
<DIV class=Tag>
<SCRIPT language=javascript
src="什么叫回调函数? - 游戏技术专栏 - CSDNBlog.files/urltag.aspx"></SCRIPT>
<DIV style="CLEAR: both"></DIV></DIV><SPAN class=PreAndNext
id=viewpost.ascx_PreviousAndNextEntriesUp>
<DIV align=center><A
href="http://blog.csdn.net/gamesoftboy/archive/2007/07/19/1699576.aspx">上一篇: Windows编程学习(一)
</A> | <A
href="http://blog.csdn.net/Gamesoftboy/archive/2007/07/14/1690302.aspx">下一篇: “够级大纲”之“王中王”(初稿)</A></DIV></SPAN><BR>
<SCRIPT>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</SCRIPT>
<DIV class=post>
<DIV class=postTitle><A
href="http://blog.csdn.net/Gamesoftboy/archive/2007/07/19/1698889.aspx"><IMG
height=13 src="什么叫回调函数? - 游戏技术专栏 - CSDNBlog.files/zhuan.gif" width=15
border=0> 什么叫回调函数?</A> </DIV>
<DIV class=postText>
<P>回调的意思大体上就是: <BR> 如果把函数分层的话,上层调下层的叫“调用”,下层调上层的叫“回调”。</P>
<DIV class=fabiao>发表者:beyondtkl</DIV>
<P>就是: 不是你直接调用的函数 而是 系统/或者其他地方调用的 <BR> 比如
如果是api需要传入回调函数 那么就是api里面调用这个回调函数 <BR> 如果是你自己的函数调用
。。那么同样了 比如 <BR> <BR> typedef int
(__stdcall *pfunc)(int, int); <BR>
<BR> int __stdcall max(int a, int b)
<BR> { <BR> return a > b
? a : b; <BR> } <BR>
<BR> int __stdcall test(pfunc func, int
a, int b) <BR> { <BR>
<BR> return func(a, b); <BR> }
<BR> <BR> void main() <BR> {
<BR> cout << test(max, 1, 30)
<< endl; <BR> } <BR> <BR>
</P>
<DIV class=fabiao>发表者:foochow</DIV>
<P>回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就 <BR>
是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可 <BR> 以在回调函数里完成你要做的事。
<BR> </P>
<DIV class=fabiao>发表者:wingforce</DIV>
<P>stdcall指参数传递方式按照标准方式传送(压栈) <BR> 从左向右</P>
<DIV class=fabiao>发表者:llmsn</DIV>
<P>从右向左入栈吧参数.</P>
<DIV class=fabiao>发表者:wingforce</DIV>
<P>嘿嘿,不记得了 <BR> disamble一下就可以确认</P>
<DIV class=fabiao>发表者:zjxiaoyu</DIV>
<P>类似于协议的分层. <BR> 比如应用层,驱动层...等等.一般来说,上下层的数据传递的方法有
<BR> 1:函数调用 <BR> 2:如果有message queue的话,可以post
消息. <BR> 3:share memory之类的. <BR>
用函数调用方式的时候,一般都只是上层调用下层,下层不关心上层的东西,不会去主动调上层的函数.而有的时候,下层要往上层传数据,
就需要用到回调函数.比如,上层要播放midi,(假设midi的播放是异步的),那么上层怎么知道什么时候播放完毕那?就可以自己写一个函数,在调用playmidi的时候,把函数指针传过去,下层完事了,调用这个回调函数.
<BR> </P>
<DIV class=fabiao>发表者:binjuny</DIV>
<P> <BR>
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础。
<BR>
对于不同类型的语言、平台或构架,客户和服务的交互除了同步方式以外,都需要具备一定的异步通知机制,让服务方在某些情况下能够主动通知客户,而回调是实现异步的一个最简捷的途径。
<BR> <BR>
对于一般的结构化语言,可以通过回调函数来实现回调。回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。
<BR> <BR>
在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类成为回调类,回调类的对象成为回调对象。对于象c++或object
pascal这些兼容了过程特性的对象语言,不仅提供了回调对象、回调方法等特性,也能兼容过程语言的回调函数机制。 <BR>
<BR>
windows平台的消息机制也可以看作是回调的一种应用,我们通过系统提供的接口注册消息处理函数,从而实现接收、处理消息的目的。由于windows平台的api是用c语言来构建的,我们可以认为它也是回调函数的一个特例。
<BR> <BR>
对于分布式组件代理体系corba,异步处理有多种方式,如回调、事件服务、通知服务等。事件服务和通知服务是corba用来处理异步消息的标准服务,他们主要负责消息的处理、派发、维护等工作。对一些简单的异步处理过程,我们可以通过回调机制来实现。
<BR> <BR> 下面我们集中比较具有代表性的语言和架构来分析回调的实现方式、具体作用等。
<BR> <BR> 2 过程语言中的回调 <BR>
<BR> <BR> 2.1 函数指针 <BR>
回调在c语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调。因此,要实现回调,必须首先定义函数指针,请看下面的例子:
<BR> <BR> <BR> void func(char
*s);// 函数原型 <BR> void (*pfunc) (char
*);//函数指针 <BR> <BR> <BR>
<BR> 可以看出,函数的定义和函数指针的定义非常类似。 <BR> <BR>
一般的化,为了简化函数指针类型的变量定义,提高程序的可读性,我们需要把函数指针类型自定义一下。 <BR>
<BR> <BR> typedef void(*pcb)(char *);
<BR> <BR> <BR> <BR>
回调函数可以象普通函数一样被程序调用,但是只有它被当作参数传递给被调函数时才能称作回调函数。 <BR>
<BR> 被调函数的例子: <BR> <BR> <BR> void
getcallback(pcb callback) <BR> { <BR>
/*do something*/ <BR> } <BR>
用户在调用上面的函数时,需要自己实现一个pcb类型的回调函数: <BR> void fcallback(char
*s) <BR> { <BR> /* do something
*/ <BR> } <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -