专栏首页秘籍酷C语言(回调函数)

C语言(回调函数)

回调函数在程序开发中是一个非常重要的概念,所谓的回调其实就是不同程序模块之间的接口和约定,是软件分层设计的基本方式。

拓展:

回调(callback)是一种非常重要的机制,主要可以用来实现软件的分层设计,使得不同软件模块的开发者的工作进度可以独立出来,不受时空的限制,需要的时候通过约定好的接口(或者标准)相互契合在一起,也就是C++或者JAVA等现代编程语言声称的所谓面向接口编程。同时回调也是定制化软件的基石,通过回调机制将软件的前端和后端分离,前端提供逻辑策略,后端提供逻辑实现。

我们知道C语言中的函数实际上就相当于一个人,你给他一些参数,他帮你完成一样固定的功能,比方说你给厨师一个菜名,他将会把这道菜烹饪出来,你给医生一位病人,他将会对这位病人进行医治等等,这里,厨师和医生都相当于功能确切的函数,等着你来调用。我们身边不乏有很多这样的“函数”,假设你每天都到食堂吃饭,慢慢地你发现每次吃饭来回一趟走路的时间太长,于是你想让前台小妹吃饭时顺便帮你打饭回来,那么,在小妹外出午餐之前,你传递一些参数给她(比方说:10块钱,以及说清楚你要吃什么),半个小时后,小妹拿着饭堂热腾腾的盒饭回来给你。这就是普通函数的调用过程:你调用了小妹,实现了你脚不挪手不动也能吃上饭的夙愿,用图来说明一下这个过程:

那什么是回调呢?

吃了食堂的饭一个礼拜之后,实在太难吃,你已经确定你无法再吃下去了,于是你决定不吃食堂的饭,改为自己做饭吃,当然你不能亲自出马,你还是调用前台小妹帮你干活,这次你也必须给她一些钱,以及你想吃的东西,让她帮你去菜市场买回来做好,端给你吃。虽然前台小妹非常愿意为你效劳,她可以跑腿、买菜、砍价、端茶递水,但可惜她不会做饭,你急中生智,果断地从黑市雇佣了一名资深大厨,啥也不会就会做饭,你只要给他材料就行了。这样,你的午饭的产生过程变成了:你将要吃的菜品清单和需要花的钱传递给前台小妹,不仅如此,你还把大厨的电话号码给到小妹,叮嘱说:买了菜就打这个电话,让他帮你把菜做了,然后你捯饬好了给我送过来。于是小妹屁颠屁颠地就出去买菜了,与此同时,你可以“定制”你的大厨,你叮嘱你的大厨说:大厨,我喜欢吃辣,以后你做的任何菜里,都要放够足量的辣椒。请看:

在上面的“午饭”秀中,实现了典型的回调机制,你定制了一位做任何菜都死命放辣椒的大厨,然后你在调用前台小妹的同时,将大厨的电话号码也给到她,小妹在需要做饭的时候,就会根据你提供的参数(大厨的电话)回过去调用(回调!)那位大厨,做好饭后小妹再细心地捯饬捯饬,端给你吃。

你还应该注意到,在上图中一个最重要的信息:左边的两个人和右边的那个人之间有一条饱含深意的虚线,他意味着左右两边是两拨人,左边的人负责做饭和吃饭,右边的人负责跑腿、砍价等。比如:你只要知道怎么找到前台小妹,传给她参数让她干活就行了,根本不需要知道她究竟到哪儿买的菜跑了多远的路,另外管好大厨,让他死命放辣椒就行了,也根本不需要管小妹什么时候会去找大厨,以及他们之间的任何其他事情。对于右边的小妹而言,她只要根据你的嘱咐勤快跑腿,有必要的时候“回调”一下大厨就行了,也根本不管大厨做的饭究竟啥口味。

瞧,左右两拨人各干各的,互不耦合,独立性强,但又可以非常方便地相互合作,达成一个更丰富的功能。这里,大厨就是一个回调函数——一个不被设计者(你)直接调用,而是被其他人(小妹)回过来调用的函数。你传递给小妹的电话号码,相当于一个能找到大厨的指针,被称之为函数指针,回调机制就是靠传递函数指针来告知回调函数的位置的。

本文分享自微信公众号 - 秘籍酷(mijiku040),作者:林世霖

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux基础(进/线程间的竞争)

    今天,继续来讨论哲学话题。什么是真正的公平?给你两个选择,第一:全部人排一样的队,吃一样放的饭,赚一样的钱。第二:人人都分三六九等,有人高高在上事事优先,有人人...

    用户2617681
  • Linux并发(多线程协作)

    一个程序里的线程数,就像一家公司里的员工数一样,太少了忙不过来,太多了入不敷出。因此我们需要有更好的机制来协调它们。

    用户2617681
  • Linux并发(POSIX信号量)

    System-V的信号量是老古董,除非万不得已,否则我们一般用POSIX信号量,好用、简单、靠谱。

    用户2617681
  • 读构建之法-现代软件工程

    学生时代老师教过我们 程序=算法+数据结构, 但是程序就是一个软件了么?其实并不是,一个程序要想成为一个软件是需要经过很多的过程的,包括需求分析、设计、测试、发...

    Dylan Liu
  • 益联益家-学习新时代 教育新消费 深圳·峰会 圆满落幕!

    2018年5月13日,由中国电子商务协会监管沙盒工作委员会、深圳市电子商务协会主办,益联益家电子商务有限公司承办,国盾聚亿(深圳)电子商务有限公司、广东央务区块...

    益联益家
  • 深度解析ug1292(4)

    在分析place_design生成的dcp时,就要开始关注保持时间违例,尤其是当WHS < -0.5ns时。这是因为过大的保持时间违例往往会导致布线时间增大,同...

    Lauren的FPGA
  • Android IPC机制

    使用多进程只有一种方法——给四大组件指定android:process 在多进程模式中,不同进程会拥有独立的虚拟机,Application和内存空间

    提莫队长
  • tensorflow ‘/biases/Adam_1’not in ckpt file

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/d...

    DoubleV
  • FATAL ERROR: please install the following Perl mod

    九州暮云
  • error please select android sdk

    https://blog.csdn.net/CHITTY1993/article/details/78779125

    IT大飞说

扫码关注云+社区

领取腾讯云代金券