什么是回调函数?为什么要使用回调函数?如何使用回调函数?
1. 什么是回调函数:
函数指针的调用,即是一个通过函数指针调用的函数;
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。
In computer programming, a callback is any executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at a given time. This execution may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback.
即:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,就叫做回调。如果代码立即被执行就称为同步回调,如果在之后晚点的某个时间再执行,则称为异步回调。
比如:我们去“新白鹿”餐馆点餐,好多人排队正在等餐,你吃完了我才能进去吃,我就在哪儿一直等着......我也不急么;后来你过来要吃饭,我先给你一个电子牌替你排好队,我先做给其他顾客吃,你去干你自己的事(逛附件商场),等好了,我叫你(并把你要的饭菜给你),这就是回调。
2. 为什么要使用回调函数
回到函数作用:“解耦”,普通函数代替不了回调函数的这个特点。这是回调函数最大的特点。
#include<stdio.h>
#include<freeLib.h> // Callback Function
int Callback()
{// TODOfunc();return 0;
}// Main program
int main()
{// TODOLibrary(Callback);return 0;
}
使用回调函数,和普通函数调用区别:
1)在主入口程序中,把回调函数像参数一样传入库函数。这样一来,只要我们改变传进库函数的参数,就可以实现不同的功能,且不需要修改库函数的实现,变的很灵活,这就是解耦。
2)主函数和回调函数是在同一层的,而库函数在另外一层。如果库函数对我们不可见,我们修改不了库函数的实现,也就是说不能通过修改库函数让库函数调用普通函数那样实现,那我们就只能通过传入不同的回调函数了,这也就是在日常工作中常见的情况。
回调函数其实就是函数指针的一种用法:A "callback" is any function that is called by another function which takes the first function as a parameter。
注:使用回调函数会有间接调用,因此,会有一些额外的传参与访存开销,对于MCU代码中对时间要求较高的代码要慎用。
3. 回调函数:使用其实也是不得已而为之,是一种解决问题的策略
回调函数的使用是对函数指针的应用,函数指针的概念本身很简单,但是把函数指针应用于回调函数就体现了一种解决问题的策略,一种设计系统的思想。
回调函数的缺点:
1)回调函数固然能解决一部分系统架构问题但是绝不能再系统内到处都是,如果你发现你的系统内到处都是回调函数,那么你一定要重构你的系统。
2)回调函数本身是一种破坏系统结构的设计思路,回调函数会绝对的变化系统的运行轨迹,执行顺序,调用顺序。回调函数的出现会让读到你的代码的人非常的懵头转向。
回调函数是一种不得以而为之的设计策略比如:
在一个下载系统中有一个文件下载模块和一个下载文件当前进度显示模块,系统要求实时的显示文件的下载进度,想想很简单在面向对象的世界里无非是实现两个类而已。但是问题恰恰出在这里,显示模块如何驱动下载进度条?显示模块不知道也不应该知道下载模块所知道的文件下载进度(面向对象设计的封装性,模块间要解耦,模块内要内聚),文件下载进度是只有下载模块才知道的事情,解决方案很简单给下载模块传递一个函数指针作为回调函数驱动显示模块的显示进度。
在面向对象的世界中这样的例子还真不少,造成这样的问题的根源,是面向对象的程序设计思想,设计模式中要求的模块独立性,高内聚低耦合等特性。
我们需要模块间的协作,同时我们又厌恶的摒弃模块间你中有我我中有你的暧昧关系那如何生成系统呢?是函数指针(不一定一定是函数指针)也就是使用回调的方式。如果一个对象关心另一个对象的状态变化那么给状态的变化注册回调函数让它通知你这类状态的改变,这样在封装了模块变化的同时实现了模块间的协作关系另辟独径的给对象解耦。
参考:为什么要使用回调函数?(这个回答太精彩了)_iamspoon的博客-CSDN博客_使用回调函数的目的
C 语言回调函数详解 | 菜鸟教程
https://www.jianshu.com/p/75f261df59e6
什么是回调函数?为什么要使用回调函数?如何使用回调函数?相关推荐
- 函数指针--Nginx和Redis中两种回调函数写法
1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connectio ...
- 6、函数返回值、this、递归及回调函数
一.函数的返回值 ==> return 1. return将函数内部的值返回到函数外,函数外若想使用,必须要接收该返回值 2. return若不书写或者直接写return,函数的返回值为unde ...
- java 自定义函数的调用_Java/Android中的函数调用回调函数自定义回调函数
在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都 ...
- memcpy函数_如何理解c语言中的回调函数
在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 这段话不是那么好理解,不同语言实现回调的方式有些许不 ...
- C语言工作笔记-对函数指针的进一步认识(与回调函数结合使用,并且对比C++的回调)
目录 背景和基本概念(含与C++回调对比) 函数指针最一般的用法 函数指针结合回调 源码打包 背景和基本概念(含与C++回调对比) 毕业也有10个月了,加上实习已经工作14个月了,感觉这一年多的板砖生 ...
- 回调函数例子_Linux C - C基础篇八(函数)
概念 函数可以被看作是一个由用户定义的一系列操作的集合.一般来说,函数用一个名字来表示.函数的操作数,称为参数,由一个位于括号中,并且用逗号分隔的参数列表指定,如果该函数没有参数需要传入,则这个列表为 ...
- C语言带参数的回调函数怎么传参,C语言如何实现回调函数
回调函数就是就是通过一个统一的接口实现不同的功能,C语言中的回调函数就是在代码中根据所传的参数不同而调用不同的回调函数 回调函数是一个程序员不能显式调用的函数:通过将回调函数的地址传给调用者从而实现调 ...
- python中延时函数_详解python中实现延时回调普通函数
这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 前言 ...
- 斐波那契回调线怎么画_斐波那契回调线(黄金分割线)神级操作-经典
原标题:斐波那契回调线(黄金分割线)神级操作-经典 斐波那契回调线,又称黄金分割线.在交易市场上,大多数的技术指标都具有滞后性,导致交易者在使用时不太好掌握.但是,斐波那契回调线具有提前性,能很好的帮 ...
- 斐波那契回调线怎么画_斐波那契回调线的运用
斐波那契回调线的运用-图文并茂 我做这个算是文章吧,一个是对自己的一个总结,另外就是能真正结交一些志同道合共同爱好的朋友,给我提出宝贵意见.所以 有缘人要认真看才行啊. 相信很多人都知道斐波那契回调线 ...
最新文章
- Android Paint
- Seeduino XIAO开发板安装Arduino软件包以及USB串口驱动
- 电脑重装系统文件会丢失吗_电脑黑屏,利用重装系统软件,把黑屏电脑里的文件拷出来...
- c语言编译器怎么用scanfkl,C语言一些笔记
- 投屏连接台式计算机,笔记本如何连接一体电脑进行投屏?
- LFS、BLFS、ALFS、HLFS的区别详解
- c malloc 头文件_C/C++求职者必备 23 道面试题,一道试题一份信心!
- 100m光纤测速多少正常_光纤收发器的分类知识详解
- 6 自定义控件之屏蔽控件的设计时属性
- 数据库中的超码、候选码、主码
- IDEA调整输出字体的字体与大小
- python setdefault函数_Python字典(Dictionary)setdefault()函数理解
- 27. Location reload() 方法
- 免费好用的划词搜题神器插件
- Python Excel xlsx,xls,csv 格式互转
- 谈谈人工智能的罪与罚
- 在Unity 2018中充分使用TextMesh Pro
- 挤出机是什么?跟模具有什么关系?
- PythonWeb全栈开发介绍
- 什么是java修饰符_java修饰符是什么?
热门文章
- tf变换及工具说明(1)
- 计算机应用基础实验指导2015,2015计算机应用基础实验.doc
- 有了谷歌Chrome,依然离开不开微软IE
- 读博士可能后悔四年,不读博士可能后悔一辈子
- 强化学习(一)Fundamentals of Reinforcement Learning
- 动态规划之最长公共子序列问题
- php fclose返回值是,PHP中的fclose()函数
- 软文推广如何运动软文性广告来营销?
- 沃特世ACQUITY PREMIER色谱柱为色谱分析树立全新性能标杆
- matlab 不用phantom,2dshepp-logan模型matlab代码 不要用phantom函数