Callback回调函数介绍(C语言)

article/2025/9/17 12:09:45

目录

1. 回调函数的定义

2. 为什么要用回调函数

3. 怎么用回调函数

3.1 怎么使用没有参数的回调函数

3.2 怎么使用带参数的回调函数


1. 回调函数的定义

最近在工作中经常用到回调函数callback,总结一下。

先来看看维基百科对callback的解释: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.也就是说,把一段可执行的代码像参数传递一样传递给其他代码,而这段代码会在某个时刻被调用执行,这就叫回调。如果代码被立即执行就被称为同步回调,如果在之后晚点的某个时间再执行,则被称之为异步回调。

再来看看来自Stack Overflow某位大神的表述:A “callback” is any function that is called by another function which takes the first function as a parameter. 也就是说,函数F1调用函数F2的时候,函数F1调用函数F2时,F1通过参数给F2传递了另一个函数F3的指针,在F2执行的过程中会调用函数F3,这个动作就是回调(callback),而被作为指针传入、后面又被回调的函数F3就是回调函数。

最后再看看百度百科的解释:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

2. 为什么要用回调函数

为什么不能像普通函数那样在回调的地方直接写上函数的名字呢?为什么非得用回调函数呢?其实在某些时候回调函数可以使用普通函数来实现,但是回调函数还是有其存在的作用的。其中回调函数最大的好处就是解耦,因此普通函数不能完全替代回调函数。

#include<stdio.h>
#include<softwareLib.h>
int Callback()           //Callback Function
{//TODOreturn 0;
}int main()
{//TODOLibrary(Callback);//TODOreturn 0;
}

仔细一看,在回调函数中,主程序把回调函数像参数一样传入库函数。这样一来,只要改变传进库函数的参数,就可以实现不同功能,并且丝毫不需要修改库函数的实现,这就是解耦。

另外,主函数和回调函数是在同一层的,而库函数在另外一层。库函数被封装在库中,不能修改库函数的实现,也就是说不能通过修改库函数让库函数调用普通函数那样实现,那我们就只能通过传入不同的回调函数了。

其实很多地方可以使用普通函数来替代回调函数,但是如果需要降低耦合度的时候,更应该使用回调函数。

3. 怎么用回调函数

3.1 怎么使用没有参数的回调函数

首先来看没有参数的回调函数,下面是一个简单的可以执行的同步回调函数代码。

#include<stdio.h>
int Callback_1()
{printf("Hello, this is Callback_1 \n");return 0;
}int Callback_2()
{printf("Hello, this is Callback_2 \n");return 0;
}int Callback_3()
{printf("Hello, this is Callback_3 \n");return 0;
}int Handle(int (*Callback)())
{printf("Entering Handle Function.\n");Callback();printf("Leaving Handle Function. \n");
}int main()
{printf("Entering Main Funtion. \n");Handle(Callback_1);Handle(Callback_2);Handle(Callback_3);printf("Leaving Main Function.\n");return 0;
}

运行结果是:

Entering Main Function.
Entering Handle Function.
Hello, this is Callback_1
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_2
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_3
Leaving Handle Function.
Leaving Main Function.

可以看到,Hanle()函数里面的参数是一个指针,在main()函数里调用Handle()函数时,给它传入了Callback_1()/Callback_2()/Callback_3()的函数指针,也就是说,回调函数其实是函数指针的一种用法。再后头看一遍:“A “callback” is any function that is called by another function which takes the first function as a parameter.” 是不是更明白一些呢?

3.2 怎么使用带参数的回调函数

上一节我们知道了回调函数怎么使用,如果回调函数需要输入参数呢?当然可以使用带参数的回调函数。只需要简单修改一下上面的例子:

 #include<stdio.h>int Callback_1(int x) // Callback Function 1
{printf("Hello, this is Callback_1: x = %d \n", x);return 0;}int Callback_2(int x) // Callback Function 2
{printf("Hello, this is Callback_2: x = %d \n", x);return 0;}int Callback_3(int x) // Callback Function 3
{printf("Hello, this is Callback_3: x = %d \n", x);return 0;}int Handle(int y, int (*Callback)(int))
{printf("Entering Handle Function. \n");Callback(y);printf("Leaving Handle Function. \n");}int main()
{int a = 2;int b = 4;int c = 6;printf("Entering Main Function. \n");Handle(a, Callback_1);Handle(b, Callback_2);Handle(c, Callback_3);printf("Leaving Main Function. \n");return 0;}

运行结果是:

Entering Main Function. 
Entering Handle Function. 
Hello, this is Callback_1: x = 2
Leaving Handle Function.
Entering Handle Function. 
Hello, this is Callback_2: x = 4
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_3: x = 6
Leaving Handle Function.
Leaving Main Function.

可以看到,只需要回调函数增加一个参数,如int Callback_1(int x) ,再在调用时增加一个参数(int Handle(int y, int (*Callback)(int))),传递给回调函数就行了,同理,也可以使用多个参数的回调函数。


http://chatgpt.dhexx.cn/article/mHEduYVE.shtml

相关文章

Callback函数详解

http://shiwawa.blog.hexun.com/9925417_d.html 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理、用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢…

《软件质量保证与测试》学习笔记【第一章 软件测试基本概念】

目录 前言为什么要进行软件测试什么是软件缺陷1.1 什么是软件测试1.2 软件测试与CMMI软件质量保证SQA与软件测试的关系 1.3测试用例1.3.1什么是测试用例测试用例的五大要素测试用例1.3.2测试用例的评价标准1.3.3测试用例设计的基本原则1.3.4测试用例模板 1.4测试环境1.4.1什么是…

群晖NAS教程(十)、利用Docker安装蚂蚁笔记(leanote)

为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客 群晖NAS教程(十)、利用Docker安装蚂蚁笔记(leanote) 蚂蚁笔记是一款特别棒的笔记软件,支持Markdown语法,是程序员必备的软件之一。下面我们就在群晖DS918+的机器上docker出来一个耍耍。 一、下载蚂蚁笔记(leanote)镜…

基于 Qt 框架的开源笔记软件 VNote

关注、星标公众号&#xff0c;直达精彩内容 来源&#xff1a;OSC开源社区 作者&#xff1a;tamlok VNote是一个受Vim启发开发的专门为Markdown而优化、设计的笔记软件。 授权协议&#xff1a;MIT 开发语言&#xff1a;C/C JavaScript HTML/CSS SHELL 操作系统&#xff1a;跨平台…

VisionPro软件笔记

VisionPro笔记 1、CogPMAlignTool的操作方法&#xff1a; 抓取图像-设置训练区域及参数-训练模板-设置运行参数与区域-运行-查看结果 2、CogPMAlignTool的基本原理&#xff1a; 图案位置搜索工具&#xff08;识别定位&#xff09;基于边缘特征的模板而不是基于像素的模板匹配…

一款开源的支持离线的支持MarkDown的优秀笔记软件----思源笔记

日常工作中&#xff0c;大家可能会用笔记软件记录自己积累的一些知识&#xff0c;组建自己的知识管理系统&#xff0c;常用的工具可能有云笔记&#xff0c;如有道云笔记&#xff0c;印象笔记等&#xff0c;但是有时候在工作中&#xff0c;信息比较敏感&#xff0c;不能够将信息…

一文了解常用效率记笔记软件(超过20款含有图片和双向链笔记)

前言 Mac 软件推荐下载网址 麦软网&#xff1a;https://www.macfz.com腾讯柠檬&#xff1a;https://lemon.qq.com/lab 更新时间 第七次更新 6 月 28 号 &#xff0c;对于有道和印象的理解&#xff0c;有时间把这篇文章拆分下第六次更新 5 月 27 号&#xff0c;更新了如何看待…

知识管理软件,有道云笔记的优缺点和C笔记

前言 软件有道云笔记C笔记发布时间2011年6月28日还在内测所属公司网易公司北京创新乐知网络技术有限公司 1.笔记的重要性&#xff1a; 大家有没有一种种感受&#xff0c;我们成日钻研书籍&#xff0c;天天认真听讲&#xff0c;发奋学习&#xff0c;收到的反馈却并不理想&…

OneNote-做笔记的软件-强烈推荐

一、认识电子笔记本 普通笔记本转化为电子笔记本 笔记可以将我们的想法和从外部获取的信息进行归纳和整理&#xff0c;而电子笔记本就是将传统的笔记进行了电子化电子笔记本的优势 可搜索统一管理高效编辑可修改性多端同步主流电子笔记本 OneNoteEver note(印象笔记)Notability…

推荐几款好用的云笔记软件

一直钟爱印象笔记&#xff0c;程序员的电脑上必装的软件&#xff0c;但最近期限到了&#xff0c;再也不能像以前无限制的上传文件&#xff0c;续费也比去年的只要九块九一年高出了很多倍&#xff0c;因此&#xff0c;注册试用了其他的笔记&#xff0c;发现云笔记众多&#xff0…

php个人笔记系统 开源,Github精选!一款开源免费的轻量级笔记软件

更多精彩内容&#xff0c;请关注公众号【平凡而诗意】 ​ 笔记软件是工作和学习过程中经常会用到的软件&#xff0c;会议纪要、工作事项、待办&#xff0c;都需要用到笔记软件&#xff0c;这样能够明确做事的先后顺序&#xff0c;能够提高做事的效率。 笔记软件数不胜数&#x…

软件工程复习笔记 类图

类图 前言1 类图的概念1、类图2、类图的作用3、类图的组成元素 2 UML中的类&#xff08;&#xff11;&#xff09;类的定义&#xff08;&#xff12;&#xff09;类的表示&#xff08;&#xff13;&#xff09;类的命名&#xff08;&#xff14;&#xff09;类的属性&#xff0…

想找一款读书笔记软件?快来试试BookxNote

去年看到网上介绍 BookxNote 是一款做读书笔记的好工具&#xff0c;被誉为“ Windows 端的 MarginNote” 。当时试用了一下感觉挺好&#xff0c;但是在笔记和书籍的存储上还有一些困惑&#xff0c;因此有点顾虑。最近看教程和自己尝试&#xff0c;解决了困惑&#xff0c;在此分…

做笔记软件

做笔记软件 找最好的笔记软件:三强篇(EverNote、Mybase、Surfulater) [转载请保留] 版本1.0 编译xbeta/善用佳软 出自 http://blog.sina.com.cn/u/46dac66f01000b57 寻找最好的笔记软件&#xff1a;三强篇(EverNote、Mybase、Surfulater) v1.0 作者: SuperboyAC 编译: xbe…

【笔记软件obsidian】从入门到精通

目录 一.前言 二.下载及安装,基本使用方法 三.完成第一篇笔记&#xff08;重点&#xff09; 四.【选修】ios用户如何通过iCloud进行三平台同步 五.基本Markdown语法&#xff08;一定要看完&#xff01;&#xff09; 六.结语 一、前言&#xff1a; 最近被很多同学问到&#xff…

计算机记笔记软件是什么,电脑记笔记软件哪个好(适合学生做笔记的软件)

瞬息万变的世界&#xff0c;软件的更迭也风起云涌。各色各样的软件层出不穷让人眼花缭乱&#xff0c;一次又一次的更新让人应接不暇&#xff0c;还没弄清一个软件的用法又被另一个软件吸引了目光。这种现象无论是在 软件介绍 1. XMind XMind 是一款思维导图软件&#xff0c;他支…

几个离线笔记软件推荐

eDiary 官网&#xff1a;http://www.haoxg.net/ eDiary的作用不仅仅在于写日记&#xff0c;您也可以用它来记流水帐、写工作日志&#xff0c; 记录学习心得&#xff0c;或者用它来管理你的日常文档。eDiary以时间为主线&#xff0c;以文 字为载体&#xff0c;记录你的心路历程…

Notion 程序猿必备笔记软件

我发现工作时间比较久的人&#xff0c;都会逐渐养成记笔记的习惯&#xff0c;我也是&#xff0c;我之前已经使用国内某云笔记8年之久&#xff0c;而且是多年的会员。但我今天要给大家推荐另一款笔记软件——Notion&#xff0c;国内可能Notion的使用还比较少&#xff0c;但它却在…

笔记软件对比

之前一直用的印象笔记和有道云笔记&#xff0c;14年大学毕业的时候用的有道云笔记。积累了很多了。工作后用了印象笔记。mac下面的暗黑模式用得很舒服&#xff0c;奈何windows下界面丑得不要不要的。还不能更换纸张背景。一大片白。 上个月换了工作了&#xff0c;用的公司发的…

离线脱机版个人笔记软件的选择

笔者平时在工作过程中&#xff0c;经常有一些心得体会或者操作手册之类的内容需要记录&#xff0c;之前一直是采用word版本或者网络文章blog等方式予以记录。但是总觉得不是特别方便&#xff0c;要么受限于网络&#xff0c;不方便上网的地方无法使用&#xff0c;要么是文章组织…