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

为何我会想起剖析这个论题呢?这是在我作业时与一搭档在和谐功用对接时用到了回调函数,让 我收获颇丰。很久了,可是这个疑问在昨日看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 也能够确保根底库不会在常常的修正中引进过错。
        经过以上的比照剖析,我想,此刻你应该对回调函数机制有了充分的了解吧。假设发现有疑问,请提出,假设又不明白,也记住提出哦。

时间: 2024-10-10 22:01:06

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

js函数引用、函数调用与回调函数

var function1=function2; 1.调用function1()函数的结果正好与调用function2()相同,因为两个函数都引用了相同的代码,因此函数名称也称为函数调用. 2.引用函数与调用函数的区别与函数名称后是否附有括号有关,函数引用只会单独出现,但函数调用则必定后随括号,很多时候还附有自变量. 3.window.onload=function(){ function1(); } 此时function1();就是回调函数,网页上所有其他事件能于onload事件处理器中作联结

回调函数设计方法

引入: 你显示器不亮了,你不知道怎么弄,那你就问在外地干IT的大表哥,你大表哥告诉你修理的方法,然后需要你自己来操作. 你大表哥知道怎么弄,但是自己不去弄,而是由你去弄. 换句话说,你大表哥实现了修理你显示器的方法,但他不会自己去调用,而是由你去调用.那么你大表哥告诉你的修机器的方法就是回调函数. 在这个比喻里,你自己 作为主调方,有实际的需求--修显示器,但是没有方法,求教表哥的时候,表哥给你的方法 就是一个 函数地址,当你按照大表哥的方法执行的时候,就是 执行了一个回调函数了. 在工程设计中

回调函数的应用误区2(与原理相悖的回调函数)

研究了一段时间回调函数,越看越迷惑,分析并改进了从网上看到的几篇好文,看过后有了自己的看法.我也不知道这些跌跌撞撞的认识是否符合回调的真实原理,若有大侠能帮解惑,自当感激不尽. 下面的代码可以在Vs2008下编译并运行: 个人观点: 以下代码虽说是按照C/S,调用者/被调者的思路去设计回调函数的,但实际上整个代码里面缺少最关键一环:没有出现被调函数(即用回调函数做参数的函数),所以不符合回调函数的基本原理. 就把它当成c/s模式下的函数指针调用吧,或者不伦不类的函数指针调用,没有理解到回调函数的

类成员函数可以为回调函数吗

关于类成员函数是否可以成为回调函数,我们首先需要明确几个定义,1. 什么是回调函数 2. 为什么要使用回调函数 3. 调用普通类成员函数和调用回调函数有什么区别 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数 为什么要使用回调函数? 因为可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型.某些限制条件(如返回值为int

回调函数模型设计

Javascript中,回调函数是基于事件轮询实现事件驱动的主要表现形式,回调函数的设计并不难,这里简单介绍两种情况:带参数与不带参数. 不带参数: function sing(callback){ callback(); } sing(function(){ console.log("无参数"); }); //“无参数” sing函数执行时,执行callback函数,这里执行里面的匿名函数,这里提醒一下,无论声明式函数.表达式函数.还是匿名函数作为参数效果是一样的,在Js里,函数作为

回调函数的应用误区3(大彻大悟的回调小程序,例子的解释相当给力)

研究了一段时间回调函数,越看越迷惑,分析并改进了从网上看到的几篇好文,看过后有了自己的看法.我也不知道这些跌跌撞撞的认识是否符合回调的真实原理,若有大侠能帮解惑,自当感激不尽. 下面的代码可以在Vs2008下编译并运行: 所有的回调函数文章里,能让我一下看明白回调函数的就是这篇文章了,描述简单,一语中的:http://hi.baidu.com/zht7216/item/1dd32e82a68c40d15f0ec154 摘选如下: 函数指针是一个指向函数的指针变量,它是专门来存放函数入口地址的,在

回调函数的应用误区1(原汁原味的函数指针应用)

研究了一段时间回调函数,越看越迷惑,分析并改进了从网上看到的几篇好文,看过后有了自己的看法.我也不知道这些跌跌撞撞的认识是否符合回调的真实原理,若有大侠能帮解惑,自当感激不尽. 下面的代码可以在Vs2008下编译并运行: 个人观点: 虽说代码里面到处都注解说这里是回调函数声明,那里是回调函数实现:这里是被调函数声明,那里是被调函数实现:但.....其实个人更感觉这代码更像是一篇函数指针的应用. 跟回调函数没有太大关系,说有关系那也只是格式上的关系. 个人总结: 这篇文章可以让你学会函数指针的使用

IOS - 回调函数的使用

在 IOS 的数据回调或者说代理模式大都都是通过回调函数或者Block(代码块)来实现的,Block 没什么好讲的,语法而已,这里简单理解下回调函数的工作原理. (这个回调函数的工作原理实际上的也是代理模式的过程) 一.代理类的实现 首先,新建一个代理类,并在其中写一个协议:AgencyProtocol @protocol AgencyProtocol <NSObject> - (void)cometrueSuccess:(NSString *)str; - (void)cometrueFai

什么是回调函数?回调函数适合在什么情况下使用?

一直不太理解回调函数的作用,下面是找到的一些关于回调函数的作用的解答. 1.回调函数是一个很有用,也很重要的概念.当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数. 2.回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用.为此,你需要做三件事:1,声明:2,定义:3,设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用. 3.所谓回调函数就是按照一定的形式由你定义并编写实现内容,当发生某种事件时,而由系统或其它函数来调用的函数.使用