📄 什么叫回调函数? - 游戏技术专栏 - csdnblog.htm
字号:
然后,就可以直接把fcallback当作一个变量传递给getcallback, <BR> getcallback;
<BR> <BR> <BR> <BR>
如果赋了不同的值给该参数,那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。 <BR>
<BR> 2.2 参数传递规则 <BR> 到目前为止,我们只讨论了函数指针及回调而没有去注意ansi
c/c++的编译器规范。许多编译器有几种调用规范。如在visual
c++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范。c++
builder也支持_fastcall调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序,堆栈清理责任以及参数传递机制。
<BR> <BR> 将调用规范看成是函数类型的一部分是很重要的;不能用不兼容的调用规范将地址赋值给函数指针。例如:
<BR> <BR> <BR> //
被调用函数是以int为参数,以int为返回值 <BR> __stdcall int
callee(int); <BR> <BR> // 调用函数以函数指针为参数
<BR> void caller( __cdecl int(*ptr)(int));
<BR> <BR> // 在p中企图存储被调用函数地址的非法操作 <BR>
__cdecl int(*p)(int) = callee; // 出错
<BR> <BR> <BR> <BR>
指针p和callee()的类型不兼容,因为它们有不同的调用规范。因此不能将被调用者的地址赋值给指针p,尽管两者有相同的返回值和参数列
<BR> <BR> 2.3 应用举例 <BR>
c语言的标准库函数中很多地方就采用了回调函数来让用户定制处理过程。如常用的快速排序函数、二分搜索函数等。 <BR>
<BR> 快速排序函数原型: <BR> <BR> <BR> void
qsort(void *base, size_t nelem, size_t
width, int (_userentry *fcmp)(const void *,
const void *)); <BR> 二分搜索函数原型:
<BR> void *bsearch(const void *key, const
void *base, size_t nelem, <BR> size_t
width, int (_userentry *fcmp)(const void
*, const void *)); <BR>
<BR> <BR> <BR> 其中fcmp就是一个回调函数的变量。
<BR> <BR> 下面给出一个具体的例子: <BR> <BR>
<BR> #include <stdio.h> <BR> #include
<stdlib.h> <BR> <BR> int
sort_function( const void *a, const void
*b); <BR> int list[5] = { 54,
21, 11, 67, 22 }; <BR>
<BR> int main(void) <BR> { <BR> int
x; <BR> <BR> qsort((void *)list,
5, sizeof(list[0]), sort_function); <BR> for
(x = 0; x < 5; x++)
<BR> printf("%i\n", list[x]); <BR> return 0;
<BR> } <BR> <BR> int
sort_function( const void *a, const void
*b) <BR> { <BR> return
*(int*)a-*(int*)b; <BR> } <BR> <BR>
<BR> <BR> 2.4 面向对象语言中的回调 <BR>
<BR>
dephi与c++一样,为了保持与过程语言pascal的兼容性,它在引入面向对象机制的同时,保留了以前的结构化特性。因此,对回调的实现,也有两种截然不同的模式,一种是结构化的函数回调模式,一种是面向对象的接口模式。
</P><BR><BR>
<P id=TBPingURL>Trackback:
http://tb.blog.csdn.net/TrackBack.aspx?PostId=1698889</P><BR></DIV>
<DIV class=postFoot>
<SCRIPT src=""></SCRIPT>
[<A title=功能强大的网络收藏夹,一秒钟操作就可以轻松实现保存带来的价值、分享带来的快乐
href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏到我的网摘</A>]
Gamesoftboy发表于 2007年07月19日 14:18:00 </DIV></DIV><LINK
href="http://blog.csdn.net/Gamesoftboy/Services/Pingback.aspx" rel=pingback><!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:Descriptionrdf:about="http://blog.csdn.net/Gamesoftboy/archive/2007/07/19/1698889.aspx"dc:identifier="http://blog.csdn.net/Gamesoftboy/archive/2007/07/19/1698889.aspx"dc:title="什么叫回调函数?"trackback:ping="http://tb.blog.csdn.net/TrackBack.aspx?PostId=1698889" /></rdf:RDF>-->
<SCRIPT>function hide(){showComment();}</SCRIPT>
<BR>
<DIV class=post>
<DIV class=postTitle>相关文章:</DIV>
<UL class=postText>
<LI><A href="http://blog.csdn.net/xiaoysh/archive/2004/10/22/147167.aspx"
target=_blank>[转载]回调函数概念摘抄</A> 2004-10-22 <A
href="http://blog.csdn.net/xiaoysh/" target=_blank>xiaoysh</A>
<LI><A href="http://blog.csdn.net/Jinhao/archive/2004/06/29/29021.aspx"
target=_blank>混沌 In C++::是类型?还是函数调用?</A> 2004-06-29 <A
href="http://blog.csdn.net/Jinhao/" target=_blank>Jinhao</A>
<LI><A href="http://blog.csdn.net/ryman/archive/2005/02/25/302222.aspx"
target=_blank>回调函数概念</A> 2005-02-25 <A href="http://blog.csdn.net/ryman/"
target=_blank>ryman</A>
<LI><A href="http://blog.csdn.net/loveXMG/archive/2005/12/19/555828.aspx"
target=_blank>使用具体的函数地址值来调用函数</A> 2005-12-19 <A
href="http://blog.csdn.net/loveXMG/" target=_blank>loveXMG</A>
<LI><A href="http://blog.csdn.net/lostmouse/archive/2001/07/15/8491.aspx"
target=_blank>Effective C++ 2e Item27</A> 2001-07-15 <A
href="http://blog.csdn.net/lostmouse/" target=_blank>lostmouse</A>
<DIV align=right><A
href="http://blog.csdn.net/gamesoftboy/relatedarticles/1698889.aspx"
target=_blank>更多内容...</A></DIV></LI></UL></DIV><BR><BR>
<DIV class=post id=csdn_zhaig_ad_yahoo></DIV>
<SCRIPT type=text/javascript>document.write("<img src=http://counter.csdn.net/pv.aspx?id=24 border=0 width=0 height=0>");</SCRIPT>
<SPAN class=PreAndNext id=viewpost.ascx_PreviousAndNextEntriesDown>
<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>
<DIV id=comments><SPAN id=Anthem_Comments.ascx_ltlComments__><SPAN
id=Comments.ascx_ltlComments><BR>
<DIV id=comments>
<H3>����</H3>没有评论。 </DIV></SPAN></SPAN></DIV>
<SCRIPT language=javascript>
ad_width=468;
ad_height=60;
adcss=2;
unionuser=19;
ad_type='j';
count=5;
</SCRIPT>
<SCRIPT language=javascript src="什么叫回调函数? - 游戏技术专栏 - CSDNBlog.files/showads.js"
type=text/javascript></SCRIPT>
<SCRIPT language=javascript src="什么叫回调函数? - 游戏技术专栏 - CSDNBlog.files/showgm.js"
type=text/javascript></SCRIPT>
<!--done-->
<DIV class=comments>添加新评论 <BR>
<DIV id=Anthem_PostComment.ascx_CommentUpdatePanel__>
<DIV id=PostComment.ascx_CommentUpdatePanel>
<TABLE class=commentsTable id=CommentForm cellSpacing=2 cellPadding=0
border=0><TBODY>
<TR>
<TD width=75>大名</TD>
<TD><INPUT id=PostComment.ascx_tbName style="WIDTH: 322px" disabled
maxLength=32 size=40 name=PostComment.ascx:tbName></TD>
<TD><SPAN id=PostComment.ascx_RequiredFieldValidator2
style="VISIBILITY: hidden; COLOR: red" initialvalue=""
evaluationfunction="RequiredFieldValidatorEvaluateIsValid"
errormessage="Please enter your name"
controltovalidate="PostComment.ascx_tbName">Please enter your
name</SPAN></TD></TR>
<TR>
<TD>网址</TD>
<TD><INPUT id=PostComment.ascx_tbUrl style="WIDTH: 322px" disabled
maxLength=256 size=40 name=PostComment.ascx:tbUrl></TD>
<TD></TD></TR>
<TR>
<TD colSpan=3><BR>评论 <SPAN
id=PostComment.ascx_RequiredFieldValidator3
style="VISIBILITY: hidden; COLOR: red" initialvalue=""
evaluationfunction="RequiredFieldValidatorEvaluateIsValid"
errormessage="Please enter a comment"
controltovalidate="PostComment.ascx_tbComment">Please enter a
comment</SPAN><BR><TEXTAREA id=PostComment.ascx_tbComment style="WIDTH: 400px" disabled name=PostComment.ascx:tbComment rows=6 cols=50></TEXTAREA>
</TD></TR>
<TR>
<TD colSpan=3><SPAN id=Anthem_PostComment.ascx_btnSubmit__></SPAN></TD></TR>
<TR>
<TD colSpan=3><SPAN id=PostComment.ascx_Message
style="COLOR: red">当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击<A
href="http://passport.csdn.net/member/UserLogin.aspx?from=http://blog.csdn.net/gamesoftboy/archive/2007/07/19/1698889.aspx">登录</A></SPAN></TD></TR></TBODY></TABLE></DIV></DIV></DIV></DIV><!--done-->
<DIV class=footer>Copyright ©2007 Gamesoftboy 模板提供:<A class=footerlink
href="http://blog.hjenglish.com/">沪江博客</A><BR></DIV>
<SCRIPT src="什么叫回调函数? - 游戏技术专栏 - CSDNBlog.files/counter.js"></SCRIPT>
<SCRIPT type=text/javascript>
<!--
var Page_Validators = new Array(document.getElementById("PostComment.ascx_RequiredFieldValidator2"), document.getElementById("PostComment.ascx_RequiredFieldValidator3"));
// -->
</SCRIPT>
<INPUT id=__EVENTVALIDATION type=hidden
value=/wEWMAL+raDpAgKz3MGoCgLOscX7CwL29ZjrCgL29ayAAgL29fBoAvb1hIwIAtne9pQFAtnemsgMAtneru0HAtnesoIPAtnexqcGAtne6twJAtne/nEC2d6ClQgC2d7W/Q4C2d76kgYC7LS21QwC7LTaigQC7LTurw8C7LTyxAYC7LSG+AkC7LSqnQEC7LS+sggC7LTC1wMC7LSWvgYC7LS60wkC152U+goC1524nwIC153MtAUC153Q6QwC153kjgQC152Iog8C152cxwYC152g/AkC1530xAwC152Y+AcClP6ZjwIClP6tpAUClP6x2QwClP7F/gcClP7pkw8ClP79yAYClP6B7AkClP6VgQECqrTotAMCwLLi2wwCouvO2AllsuhhB5QFk0niioKg46RDjGADJQ==
name=__EVENTVALIDATION>
<SCRIPT type=text/javascript>
<!--
var Page_ValidationActive = false;
if (typeof(ValidatorOnLoad) == "function") {
ValidatorOnLoad();
}
function ValidatorOnSubmit() {
if (Page_ValidationActive) {
return ValidatorCommonOnSubmit();
}
else {
return true;
}
}
// -->
</SCRIPT>
</FORM>
<SCRIPT language=javascript type=text/javascript>
<!--
try
{
hide();
}
catch(e){}
//-->
</SCRIPT>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -