C语言 —— 回调函数
文章目录
- 什么是回调函数
- 举个例子来说明回调函数:
- 回调函数作用
- 1. 实现多态(解耦)
- 2. 延迟异步调用
- 同步回调
- 异步回调
- 回调函数的使用
- 函数指针
- 回调函数示例代码
什么是回调函数
回调并不是“你我”两方的互动,而是ABC的三方联动。A调用B,B在处理完之后调用C。
举个例子来说明回调函数:
打个比方,有一家旅馆提供叫醒服务,旅客可以自己决定叫醒方法,比如让客房打电话,或者敲门。
- 首先在主程序中调用库函数,主函数就是旅客,库函数就是旅店提供的叫醒服务
- 然后把回调函数指针传入库函数中
- 回调函数是我们自己写,就是我决定的叫醒方法后的工作。
- 比如旅客第一天告诉旅店使用打电话叫醒服务,并且自定义接到电话的回调函数就是接到电话后再继续睡一会儿。那么宾馆会在第二天进行回调旅客定义打电话的方法,旅客选择在回调函数中进行处理接到电话后要继续睡觉。
- 旅客第三天告诉旅店使用敲门方式叫醒。并且敲门的自定义回调函数为立即起床。那么宾馆会在第二天调用敲门的回调函数,旅客在敲门回调函数被调用后立即起床。
上面的例子说明了回调的两个作用,一个是延迟回调,也就是我告诉宾馆第二天叫我,我就可以干我自己的事儿了。另一个优势是选择方式,就是我可以在回调函数中定义不同的处理方式,敲门,和打电话的处理方式就不同。
回调函数作用
https://www.runoob.com/w3cnote/c-callback-function.html
1. 实现多态(解耦)
由于c语言没有面向对象的概念,所以使用回调来实现多态。也就是多态的作用其实就是解耦。
解耦,很多朋友可能会想,为什么不像普通函数调用那样,在回调的地方直接写函数的名字呢?这样不也可以吗?为什么非得用回调函数呢?
有这个想法很好,因为在网上看到解析回调函数的很多例子,其实完全可以用普通函数调用来实现的。要回答这个问题,我们先来了解一下回到函数的好处和作用,那就是解耦,对,就是这么简单的答案,就是因为这个特点,普通函数代替不了回调函数。所以,在我眼里,这才是回调函数最大的特点。来看看维基百科上面我觉得画得很好的一张图片。
#include<stdio.h>
#include<softwareLib.h> // 包含Library Function所在读得Software library库的头文件int Callback() // Callback Function
{// TODOreturn 0;
}
int main() // Main program
{// TODOLibrary(Callback);// TODOreturn 0;
}
乍一看,回调似乎只是函数间的调用,和普通函数调用没啥区别,但仔细一看,可以发现两者之间的一个关键的不同:在回调中,主程序把回调函数像参数一样传入库函数。这样一来,只要我们改变传进库函数的参数,就可以实现不同的功能,这样有没有觉得很灵活?并且丝毫不需要修改库函数的实现,这就是解耦。再仔细看看,主函数和回调函数是在同一层的,而库函数在另外一层,想一想,如果库函数对我们不可见,我们修改不了库函数的实现,也就是说不能通过修改库函数让库函数调用普通函数那样实现,那我们就只能通过传入不同的回调函数了,这也就是在日常工作中常见的情况。现在再把main()、Library()和Callback()函数套回前面 F1、F2和F3函数里面,是不是就更明白了?
明白了回调函数的特点,是不是也可以大概知道它应该在什么情况下使用了?没错,你可以在很多地方使用回调函数来代替普通的函数调用,但是在我看来,如果需要降低耦合度的时候,更应该使用回调函数。
2. 延迟异步调用
这个应该是回调函数的最大重要的作用。
项目中使用的都是都是异步,我觉得最大的用处就是异步,延迟回调。
当一个操作非常耗时,而且可能出现崩溃的情况下,如果我们还使用同步回调,那么我们就要一直等这个操作执行完成才会回调。而这时我们可以使用异步回调函数。主函数调用这个耗时函数之后会继续往下走,而不会被阻塞住。这个耗时操作就自己去执行,等执行完成之后会调用回调函数,这样不影响主函数的其他操作。
异步的功能是底层提供给上层的, 我们自己写的回调函数,但是比如上面的例子中,是同步回调。
下面两幅图展示了同步回调与异步回调的区别:
同步回调
异步回调
回调函数的使用
函数指针
https://www.cnblogs.com/zhengjiafa/p/5796283.html
作用:因为c语言中只有struct而struct不像c++中的class,他是没有成员函数的,所以使用函数指针,可以将函数作为成员函数
函数指针有两个用途:调用函数、做函数的参数(主要用途)
函数指针实例:
#include <stdio.h>int Func(int x); /*声明一个函数*/
int (*p) (int x); /*定义一个函数指针*/
//函数定义
int Func(int x) {printf("asdf");return 1;
}char (*PTRFUN1)(int);//定义一个函数指针
char glFun(int a)
{ printf("out ");return 'd';
}
int main()
{p = Func; /*将Func函数的首地址赋给指针变量p*/(*p)(2); //调用函数方式一PTRFUN1 = glFun; //将glFun函数首地址给指针变量PTRFUN1(2); //调用函数方式二}
该实例并没有体现出函数指针的好处,反而使用起来更复杂。
但是通过下面的回调函数,我们就能看到函数指针的真正威力了,将函数作为参数传入另一个函数。
回调函数示例代码
异步回调最本质上就是事件驱动编程。
特性:使用函数的指针最重要的作用就是作为函数的参数。这在回调函数中完美体现。
正常情况下我们无法将一个函数传入另一个函数中。但是使用函数指针,我们可以将一个函数传入另一个函数中,这个特性在回调函数中使用,体现的淋漓尽致**。
//文件B.c
//形参使用函数指针,传入的是函数的首地址,这样我们就可以实现将函数传入另一个函数中了
//这里形参是一个函数指针,他可以接收其他函数传入。
//回调类型和库函数名称类似
void Handle(int y, int (*HandleCallbackT)(int))
{printf("Entering Handle Function. ");printf("\r\n");HandleCallbackT(y); //调用回调函数//Callback; //调用回调函数printf("Leaving Handle Function. ");printf("\r\n");
}//文件A.c
int Callback_1(int x) // Callback Function 1
{printf("Hello, this is Callback_1: x = %d ", x);printf("\r\n");return 0;
}int Callback_2(int x) // Callback Function 2
{printf("Hello, this is Callback_2: x = %d ", x);printf("\r\n");return 0;
}int Callback_3(int x) // Callback Function 3
{printf("Hello, this is Callback_3: x = %d ", x);printf("\r\n");return 0;
}//文件A.c
//callBack调用函数,调用函数和回调函数名称类似,因为他们是同一个文件,同一级
void CallBack() {int a = 2;int b = 4;int c = 6;//调用库函数,将回调函数传入,会在库函数中走回调函数//在哪里调用这个库函数,就在哪里写回调函数定义。Handle(a, Callback_1);//将callback1传入Handle(b, Callback_2);Handle(c, Callback_3);
}//test测试
int main()
{printf("Entering Main Function. ");printf("\r\n");CallBack();//这里体现出优势,为何使用回调,其实就是为了解耦,我们可以将不同的回调函数传入handle//并且不需要改变handle函数,而我们可以传入不同的函数参数printf("Leaving Main Function. ");printf("\r\n");return 0;
}
最重要的是要想清楚,在Handle函数调用之后,handle函数会调用回调函数,我们这时应该做什么,应该如何处理。
C语言 —— 回调函数相关推荐
- C语言 回调函数 callback - C语言零基础入门教程
目录 一.回调函数原理 二.回调函数简介 1.函数指针 2.指针函数 3.回调函数解释 三.回调函数实战 四.回调函数使用总结 五.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 ...
- c语言 is函数,关于C语言回调函数的详解~
原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...
- C语言回调函数demo(帮助理解)以海康isapiExternDemo回调函数为例
参考文章:c语言指针回调函数最全demo实例(简单明了一看就会) 回更 20220303 \demo\base\isapiExternDemo\isapiExternDemo.c 这边海康定义了一个回 ...
- c语言回调函数_C语言学习第26篇---函数与指针分析 回调函数
函数类型的概念 1.C语言函数也是有类型的 2.函数类型由函数返回值,参数类型,参数个数共同决定 int add(int i,int j) 的类型是 int(int , int) 3.C语言中通过ty ...
- 一文搞懂C语言回调函数
转载自:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 博主:Rdou Typing 来源:segmentfault ...
- C语言回调函数callback
一.定义和使用场合 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数.函数是你实现 ...
- C语言回调函数的定义和写法
C语言中的回调函数(Callback Function) 1 定义和使用场合 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中 ...
- c语言timer linux 回调函数_C语言回调函数详解
1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...
- C 语言回调函数详解
1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?网络上众说纷纭,有很大一部分都是使用类似这么一个场景来说明:A君去B君店里买东西,恰好缺货,A君留下号码给B ...
- c语言注册回调函数主要用途,C语言回调函数的概念及其应用
笔者能力有限,如果文中有错误的地方,欢迎各位朋友给我及时地指出来,我将不甚感激,谢谢~ 概念 引用维基百科上的关于回调函数的概念:在计算机程序设计中,回调函数,或简称回调(Callback 即call ...
最新文章
- Educational Codeforces Round 80 (Rated for Div. 2)SZU cf集训round2 C~E(dp,状压+二分,树状数组+逆向思维)
- java知识总结-15
- C语言函数最多有有多少个参数,C中子函数最多有几个形参
- 分支结构程序案例c语言,C语言学习之三——分支结构程序
- spring boot示例_Spring Boot完成示例
- nvidia 桌面录屏
- r语言kendall协和系数_多变量Kendall协和系数检验.ppt
- 【安全牛学习笔记】初识sql注入漏洞原理
- 微信运动计步器 php,微信修改步数(卡密版)v1.2.1 PHP程序
- excel查找空值快捷键_Excel快捷键查询
- Delphi ArcEngine 创建梯度专题 Proportional
- 工业以太网串口网关ENB-301MT
- 文曲星猜数游戏c语言带结果,文曲星猜数游戏 C实现
- .net基础知识学习
- 【Python-1】
- 小红书商业生态产品负责人精卫:全面解锁小红书达人营销新玩法
- 给html网页加背景图
- Kali Linux渗透测试实战 第一章
- 一篇非常好的c++学习方法,转自贴吧
- 中国空气能热水器市场品牌竞争格局与投资价值分析报告2022版