文章目录

  • 什么是回调函数
    • 举个例子来说明回调函数:
  • 回调函数作用
    • 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语言 —— 回调函数相关推荐

  1. C语言 回调函数 callback - C语言零基础入门教程

    目录 一.回调函数原理 二.回调函数简介 1.函数指针 2.指针函数 3.回调函数解释 三.回调函数实战 四.回调函数使用总结 五.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 ...

  2. c语言 is函数,关于C语言回调函数的详解~

    原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...

  3. C语言回调函数demo(帮助理解)以海康isapiExternDemo回调函数为例

    参考文章:c语言指针回调函数最全demo实例(简单明了一看就会) 回更 20220303 \demo\base\isapiExternDemo\isapiExternDemo.c 这边海康定义了一个回 ...

  4. c语言回调函数_C语言学习第26篇---函数与指针分析 回调函数

    函数类型的概念 1.C语言函数也是有类型的 2.函数类型由函数返回值,参数类型,参数个数共同决定 int add(int i,int j) 的类型是 int(int , int) 3.C语言中通过ty ...

  5. 一文搞懂C语言回调函数

    转载自:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 博主:Rdou Typing 来源:segmentfault ...

  6. C语言回调函数callback

    一.定义和使用场合 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数.函数是你实现 ...

  7. C语言回调函数的定义和写法

    C语言中的回调函数(Callback Function) 1 定义和使用场合 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中 ...

  8. c语言timer linux 回调函数_C语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...

  9. C 语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?网络上众说纷纭,有很大一部分都是使用类似这么一个场景来说明:A君去B君店里买东西,恰好缺货,A君留下号码给B ...

  10. c语言注册回调函数主要用途,C语言回调函数的概念及其应用

    笔者能力有限,如果文中有错误的地方,欢迎各位朋友给我及时地指出来,我将不甚感激,谢谢~ 概念 引用维基百科上的关于回调函数的概念:在计算机程序设计中,回调函数,或简称回调(Callback 即call ...

最新文章

  1. Educational Codeforces Round 80 (Rated for Div. 2)SZU cf集训round2 C~E(dp,状压+二分,树状数组+逆向思维)
  2. java知识总结-15
  3. C语言函数最多有有多少个参数,C中子函数最多有几个形参
  4. 分支结构程序案例c语言,C语言学习之三——分支结构程序
  5. spring boot示例_Spring Boot完成示例
  6. nvidia 桌面录屏
  7. r语言kendall协和系数_多变量Kendall协和系数检验.ppt
  8. 【安全牛学习笔记】初识sql注入漏洞原理
  9. 微信运动计步器 php,微信修改步数(卡密版)v1.2.1 PHP程序
  10. excel查找空值快捷键_Excel快捷键查询
  11. Delphi ArcEngine 创建梯度专题 Proportional
  12. 工业以太网串口网关ENB-301MT
  13. 文曲星猜数游戏c语言带结果,文曲星猜数游戏 C实现
  14. .net基础知识学习
  15. 【Python-1】
  16. 小红书商业生态产品负责人精卫:全面解锁小红书达人营销新玩法
  17. 给html网页加背景图
  18. Kali Linux渗透测试实战 第一章
  19. 一篇非常好的c++学习方法,转自贴吧
  20. 中国空气能热水器市场品牌竞争格局与投资价值分析报告2022版

热门文章

  1. NVIDIA显卡驱动安装方法
  2. hdu 1427 24点暴力dfs
  3. 计算机机房监理细则,弱电机房工程施工监理的四大重点
  4. 三维视觉、SLAM方向全球顶尖实验室汇总
  5. TimesTen In-Memory Database
  6. 135编辑器html点击图片播放音乐,135编辑器怎么给文章添加音频和视频?135编辑器给文章添加音频和视频教程...
  7. 仿微信图片编辑 全网功能最全的图片编辑器
  8. 大数据最佳实践-spark
  9. 软件开发系统分析规格说明
  10. 打包工具SetupFactory 9 的使用