什么是回调函数?为什么要使用回调函数?如何使用回调函数?

什么是回调函数?为什么要使用回调函数?如何使用回调函数?1 回调函数 函数指针的调用 即是一个通过函数指针调用的函数 如果你把函数的指针 地址 作为参数传递给另一个函数 当这个指针被用来调用其所指向的函数时 就说这是回调函数 Incomputerpr acallbackisa whic

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 
  
    #include 
   
     // Callback Function int Callback() { // TODO func(); return 0; } // Main program int main() { // TODO Library(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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208200.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午12:07
下一篇 2026年3月19日 下午12:07


相关推荐

  • ubuntu 卸载命令_Ubuntu怎么卸载

    ubuntu 卸载命令_Ubuntu怎么卸载前言本文重点介绍Ubuntu卸载软件的4种方法。他们分别是图形化界面的synaptic、自动解决依赖关系的apt-get,处理依赖关系更强大的aptitude,还有安装本地deb包的dpkg。方法一:Ubuntu使用synaptic图形化界面管理软件oucanrong@zcwyou:~$sudoapt-getinstallsynaptic-y以下是使用Synaptic管理软件的教程。输…

    2026年4月16日
    3
  • ArcGIS与地理加权回归GWR【一】「建议收藏」

    ArcGIS与地理加权回归GWR【一】「建议收藏」公众号原文ArcGIS与地理加权回归GWR【一】https://mp.weixin.qq.com/s/fMPYxO3G7ff2192ZQICN-A开个新坑啊,写一写关于地理加权回归基础的东西(深了我也不会啊),希望也能用通俗的语言来记录一下我以前学习空间统计过程中的理解。1.传统线性回归不管你有没有系统学习过,对于线性回归,相信多少都有那么点了解。回归分析实质上就是研究一个或多个自变量X对一个因变量Y的影响关系情况,如研究各地房价影响因素。X1-Xn是n个自变量,β0-βn是未

    2022年10月7日
    5
  • PSTools工具使用方法

    PSTools工具使用方法本篇文章是基于 pstools2 7 版本 pstools 是 sysinternals 出的一个功能强大的 nt 2k 远程管理工具包 它的主页为 http www sysinternals com 下载地址 https docs microsoft com zh cn sysinternals downloads pstools 使用工具的前提条件 1 首先确认组策略是否配置正确运行

    2026年3月18日
    1
  • 项“XXXXX.sln”已在选择的位置受源代码管理

    项“XXXXX.sln”已在选择的位置受源代码管理

    2021年9月9日
    57
  • centos7 文件名中文乱码_Linux服务器文件名乱码常见问题

    centos7 文件名中文乱码_Linux服务器文件名乱码常见问题1 CentOS 文件名显示乱码如下所示 原因在于 Windows 的文件名中文编码默认为 GBK 压缩或者上传后 文件名还会是 GBK 编码 而 Linux 中默认文件名编码为 UTF8 由于编码不一致所以导致了文件名乱码的问题 解决这个问题需要对文件名进行转码 处理方法 yuminstallco yconvmv fgbk tutf 8 rnotest public FTP o

    2026年3月26日
    2
  • 带着问题看源码2-NodeRed的用户认证机制是怎样的

    带着问题看源码2-NodeRed的用户认证机制是怎样的文章目录 1 几种常用的认证机制 1 1 HTTPBasicAut 2 OAuth2 NodeRed 中的认证机制使用 2 1 基于用户名 密码凭据的身份验证 2 2 针对任何 OAuth OpenID 提供者 如 Twitter 或 GitHub 进行身份验证 2 3 自定义用户身份验证 2 4 自定义的身份验证 token2 5 使用自定义 token 访问编辑器 3 功能实现的参与者 3 1 oauth2orize 主要功能及在本模块中的意义 3 2 passport3 3 express sessi

    2025年12月9日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号