⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 什么叫回调函数? - 游戏技术专栏 - csdnblog.htm

📁 最全的介绍C语言结构体的使用方法和使用技巧!
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<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">上一篇:&nbsp;Windows编程学习(一) 
</A>&nbsp;|&nbsp;<A 
href="http://blog.csdn.net/Gamesoftboy/archive/2007/07/14/1690302.aspx">下一篇:&nbsp;“够级大纲”之“王中王”(初稿)</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>&nbsp;什么叫回调函数?</A> </DIV>
<DIV class=postText>&nbsp;
<P>回调的意思大体上就是: &nbsp; <BR>&nbsp; 如果把函数分层的话,上层调下层的叫“调用”,下层调上层的叫“回调”。</P>
<DIV class=fabiao>发表者:beyondtkl</DIV>
<P>就是: &nbsp; 不是你直接调用的函数 &nbsp; 而是 &nbsp; 系统/或者其他地方调用的 &nbsp; <BR>&nbsp; 比如 
&nbsp; 如果是api需要传入回调函数 &nbsp; 那么就是api里面调用这个回调函数 &nbsp; <BR>&nbsp; 如果是你自己的函数调用 
&nbsp; 。。那么同样了 &nbsp; 比如 &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; typedef &nbsp; int 
&nbsp; (__stdcall &nbsp; *pfunc)(int, &nbsp; int); &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; int &nbsp; __stdcall &nbsp; max(int &nbsp; a, &nbsp; int &nbsp; b) 
&nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; return &nbsp; a &nbsp; &gt; &nbsp; b 
&nbsp; ? &nbsp; a &nbsp; : &nbsp; b; &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; 
&nbsp; <BR>&nbsp; int &nbsp; __stdcall &nbsp; test(pfunc &nbsp; func, &nbsp; int 
&nbsp; a, &nbsp; int &nbsp; b) &nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; return &nbsp; func(a, &nbsp; b); &nbsp; <BR>&nbsp; } &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; void &nbsp; main() &nbsp; <BR>&nbsp; { &nbsp; 
<BR>&nbsp; cout &nbsp; &lt;&lt; &nbsp; test(max, &nbsp; 1, &nbsp; 30) &nbsp; 
&lt;&lt; &nbsp; endl; &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 
</P>
<DIV class=fabiao>发表者:foochow</DIV>
<P>回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就 &nbsp; <BR>&nbsp; 
是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可 &nbsp; <BR>&nbsp; 以在回调函数里完成你要做的事。 
&nbsp; <BR>&nbsp; </P>
<DIV class=fabiao>发表者:wingforce</DIV>
<P>stdcall指参数传递方式按照标准方式传送(压栈) &nbsp; <BR>&nbsp; 从左向右</P>
<DIV class=fabiao>发表者:llmsn</DIV>
<P>从右向左入栈吧参数.</P>
<DIV class=fabiao>发表者:wingforce</DIV>
<P>嘿嘿,不记得了 &nbsp; <BR>&nbsp; disamble一下就可以确认</P>
<DIV class=fabiao>发表者:zjxiaoyu</DIV>
<P>类似于协议的分层. &nbsp; <BR>&nbsp; 比如应用层,驱动层...等等.一般来说,上下层的数据传递的方法有 &nbsp; 
<BR>&nbsp; 1:函数调用 &nbsp; <BR>&nbsp; 2:如果有message &nbsp; queue的话,可以post &nbsp; 
消息. &nbsp; <BR>&nbsp; 3:share &nbsp; memory之类的. &nbsp; <BR>&nbsp; 
用函数调用方式的时候,一般都只是上层调用下层,下层不关心上层的东西,不会去主动调上层的函数.而有的时候,下层要往上层传数据, &nbsp; 
就需要用到回调函数.比如,上层要播放midi,(假设midi的播放是异步的),那么上层怎么知道什么时候播放完毕那?就可以自己写一个函数,在调用playmidi的时候,把函数指针传过去,下层完事了,调用这个回调函数. 
&nbsp; <BR>&nbsp; </P>
<DIV class=fabiao>发表者:binjuny</DIV>
<P> <BR>&nbsp; 
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础。 
&nbsp; <BR>&nbsp; 
对于不同类型的语言、平台或构架,客户和服务的交互除了同步方式以外,都需要具备一定的异步通知机制,让服务方在某些情况下能够主动通知客户,而回调是实现异步的一个最简捷的途径。 
&nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 
对于一般的结构化语言,可以通过回调函数来实现回调。回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。 &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; 
在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类成为回调类,回调类的对象成为回调对象。对于象c++或object &nbsp; 
pascal这些兼容了过程特性的对象语言,不仅提供了回调对象、回调方法等特性,也能兼容过程语言的回调函数机制。 &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; 
windows平台的消息机制也可以看作是回调的一种应用,我们通过系统提供的接口注册消息处理函数,从而实现接收、处理消息的目的。由于windows平台的api是用c语言来构建的,我们可以认为它也是回调函数的一个特例。 
&nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 
对于分布式组件代理体系corba,异步处理有多种方式,如回调、事件服务、通知服务等。事件服务和通知服务是corba用来处理异步消息的标准服务,他们主要负责消息的处理、派发、维护等工作。对一些简单的异步处理过程,我们可以通过回调机制来实现。 
&nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 下面我们集中比较具有代表性的语言和架构来分析回调的实现方式、具体作用等。 &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; 2 &nbsp; 过程语言中的回调 &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; 2.1 &nbsp; 函数指针 &nbsp; <BR>&nbsp; 
回调在c语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调。因此,要实现回调,必须首先定义函数指针,请看下面的例子: &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; void &nbsp; func(char &nbsp; 
*s);// &nbsp; 函数原型 &nbsp; <BR>&nbsp; void &nbsp; (*pfunc) &nbsp; (char &nbsp; 
*);//函数指针 &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; 可以看出,函数的定义和函数指针的定义非常类似。 &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 
一般的化,为了简化函数指针类型的变量定义,提高程序的可读性,我们需要把函数指针类型自定义一下。 &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; typedef &nbsp; void(*pcb)(char &nbsp; *); &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 
回调函数可以象普通函数一样被程序调用,但是只有它被当作参数传递给被调函数时才能称作回调函数。 &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; 被调函数的例子: &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; void 
&nbsp; getcallback(pcb &nbsp; callback) &nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; 
/*do &nbsp; something*/ &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; 
用户在调用上面的函数时,需要自己实现一个pcb类型的回调函数: &nbsp; <BR>&nbsp; void &nbsp; fcallback(char 
&nbsp; *s) &nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; /* &nbsp; do &nbsp; something 
&nbsp; */ &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -