码迷,mamicode.com
首页 > 其他好文 > 详细

函数调用与回调函数的设计原理的深入对比分析

时间:2015-03-14 16:54:00      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:

为何我会想起剖析这个论题呢?这是在我作业时与一搭档在和谐功用对接时用到了回调函数,让 我收获颇丰。很久了,可是这个疑问在昨日看COM编程的书中,里边又用到了回调函数机制。之前说总结一下的,后来一忙,就忘了。东莞开发piao如今就说到这个了,我也发 现了回调函数的魅力了,所以,赶忙总结一篇,与君同享。
        一开始咱们学习回调函数,总是认知在体系供给回调函数,调用咱们的函数,然后到达让咱们能够操控部分行动。可是,作业时需求运用到这个机制了。由于搭档做 底层根底功用,所以,与我的功用模块交互。为了让根底库更通用,也让上层能够自由定制行动,终究选用了回调函数机制。而一开始,我仅仅觉得应该用函数调用 来完成,后来理解后,才发现函数调用的不足的地方。下面我来介绍一下函数调用和回调函数的机制比照,哈尔滨开发piao让你发现回调函数的魅力地点。不再会对回调函数又惊骇 感,反而是无限的激动。
        咱们以两个函数来阐明。

/* - 第一种方式即函数调用。- */
void A()
{
...
B();
...
}


        省略号代表其间履行了一些操作,然后调用B函数,最终在履行一些操作,A函数就履行结束。这是简略的剖析。让咱们进一步剖析。
        在外部函数调用A函数时,也即是履行A函数的代码。履行代码的含义,昆明发piao即是CPU会履行A函数生成的机器代码。从另一个视点来看,也即是,A函数此刻操控了 CPU的履行流程,安阳代开发piao即A函数有了操控权。在履行一段代码后,调用了B函数。此刻,操控权就转移到B去了。最终,B函数回来后,操控权有回来到了A。最终执 行完剩下的代码。
        咱们来看看第二种方式,即回调函数。

/* - 第二种方式即回调函数机制 - */
void A()
{
...
pFunB();
...
} 



PFUNB 为自界说的函数类型指针,界说如下:
typedef void (*PFUNB) () ;
PFUNB pFunB;
这样界说下来后,PFUNB 即是B函数的函数指针类型,用PFUNB 界说一个函数变量pFun,在用pFun来履行函数调用。
实际上,这样折腾一下,就成了回调函数。或许你如今还没有彻底理解怎样回事。下面具体解释一下。
pFun是函数指针了,天然就能够给函数指针赋值,南京发piao赋的值即是一个函数名,即函数履行体的地 址。这样被赋值后,经过函数指针调用函数和一般的B()调用没什么不同,可是却成了回调函数机制了。由于在调用函数的剖析过程中,这种方式也是相同的。而 它的特别的地方即是下面介绍的这样了,这才是回调函数的魅力地点。假设没有这个魅力,微软也不会运用那么多回调函数机制给咱们供给定制行动的机制。
        回调函数机制规划的目的即是,在底层供给根底的行动时,在不改动底层代码,就能够向上供给灵敏的行动定制才能。怎样说呢?一般来说,在规划一个根底库时, 要考虑到,根底库是频频被运用,内江代开发piao且需求十分强健的。还有一点十分重要,即是,根底库不能常常被改动,不然一个疑问会对软件形成致命性的损伤。长沙开发piao就比方,微软 体系一个通用性的缝隙,比方根底层面的核心层的代码有一个缝隙,那么会致使所有商品都陷入危机。这些影响是适当恶劣的。所以,根底库不能容易改动,一旦实 现后,经过严厉测验,今后不会容易修正。
        可是,根底库要让上层的功用完成灵敏的定制,假设选用函数调用,那是肯定不现实的。由于底层库要晓得上层函数的信息,要让上层函数供给完好的代码完成,不 也许。由于在底层库开发时或许运转时,不会晓得上层会有什么东西,更不用说要供给上层的代码完成。假设不供给,那么函数调用就无法履行。代码完成即是在调 用函数时,晓得函数中的代码是怎样履行的。也即是,有函数的完成。上海开发piao由于底层库运用时,作为根底,肯定是最早履行的,此刻上层函数都不晓得在哪,此刻又怎样 晓得上层的代码呢?假设你说代码能够先存储给根底库用,那么这还叫根底库吗?这样你存储的函数代码就成了根底库的根底了。函数调用即是这样的,它需求被调 用的函数事前存在,不然无法调用。
        可是思想略微一变,事情即是柳暗花明又一村了。已然无法供给上层函数的代码完成,那么能够供给一个函数的指针吧。看看吧,这也是指针的凶猛的地方。
        为何供给指针能够呢?C/C++供给了对指针的初始操作支撑。此刻,不需求供给上层函数的代码完成。只需求在底层库运转时经过此指针调用此函数即可。假 如经过指针调用此上层函数时,函数未完成,或许指针值过错,那么就会致使溃散。而准确的情况下,即是底层库运转此A函数前,现已对函数指针准确的赋值了。 在A履行时就能够准确的调用到函数履行。这是在根底上的技能完成。
        而另一方面,假设根底库要调用的函数是同级的函数,一起是能够供给函数完成,因而也能够顺畅的调用。可是,疑问来了。假设有许多的功用在日后不断的提出, 此刻你就需求修正根底库来供给支撑行动定制或许功用定制,昆明发piao此刻你是不是很苦恼。由于常常修正根底库会带来很坏的影响。所以给定制和拓展性带来了极大的不 便。
        而在根底库中,以函数指针的方式供给调用,则能够随时定制函数的行动。只需依照约定,在履行根底库的此函数之前,给函数指针准确的赋值,用你的定制的函数 来赋值,就能够在根底库函数中运用你的函数的履行行动,然后到达行动定制,且拓展性极好。在拓展功用和定制行动时,底子就不用再修正根底库的这个函数了。 然后, 安阳代开发piao 也能够确保根底库不会在常常的修正中引进过错。
        经过以上的比照剖析,我想,此刻你应该对回调函数机制有了充分的了解吧。假设发现有疑问,请提出,假设又不明白,也记住提出哦。

函数调用与回调函数的设计原理的深入对比分析

标签:

原文地址:http://www.cnblogs.com/bmxuhang/p/4337735.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!