1、聊一聊

今天为大家推荐一首李荣浩的,或许没有那么多的"假如",一切留给缘分就好了。好了,今天跟大家聊聊两个大家经常扯的概念,把自己的一些理解给大家聊一聊。

2、“回调”与“钩子

最近挺多小伙伴跟我聊这个话题,什么是回调函数?什么又是钩子函数?目前对于这两个概念的定义可能难以理解,在编程的过程中也是有点难区别,因为他们本质上都是属于函数,只是说是函数的一种应用的形式不同罢了,既然我们这里谈到这个话题那就好好分析分析。

不管是钩子函数还是回调函数为了保持程序的灵活性,大部分都会采用函数指针的方式进行设计,所以一般小伙伴都直接认为是函数指针的一种应用,如果从语法的角度来看,确实是这么回事,可是我们需要换一个角度去看待一个事物,就像我们之前谈面向对象编程,如果你用面向过程的思维方式去理解面向对象的设计是难以理解的,所以这里的两个概念也是一样的。

3、回调函数

应该很多小伙伴在编程中或者阅读别人的代码的时候都会看到callback的字样,是的,回调函数的英文就是callback Fuction,从字面上来理解 : 反过来调用的函数,那我们就需要知道它本来要去哪里,它又返回到什么地方执行,好,下面作者给个简单的demo:

Demo:

#include #include typedef int (*Ptr_call_back)(int ,int );/******************************************  * Fuction : 加法 * Author  : (公众号:最后一个bug)  ******************************************/int Add(int param1,int param2){return (param1 + param2);} /******************************************  * Fuction : 减法  * Author  : (公众号:最后一个bug)  ******************************************/int Sub(int param1,int param2){return (param1 - param2);} /******************************************  * Fuction : 计算函数  * Author  : (公众号:最后一个bug)  ******************************************/int Cal(int param1,int param2, Ptr_call_back call_back){return call_back(param1,param2);} /******************************************  * Fuction : 回调函数  * Author  : (公众号:最后一个bug)  ******************************************/int main(int argc, char *argv[]) {    int Val1 = 1;    int Val2 = 2;//调用计算方法     printf (" Cal = %d\n",Cal(Val1,Val2, Add));    printf (" Cal = %d\n",Cal(Val1,Val2, Sub));return 0;}

最后输出结果:

其实从形式上看来确实没有什么特别的就是函数指针的应用,不过我们换一个角度,用分层的设计角度再对回调函数进行理解,把Cal函数认为是底层函数(也可以说是库函数),把main看成是上层应用函数,而add和sub认为是上层的方法,现在main要让底层Cal去进行计算了,而我们的Cal函数再执行过程中发现不知道用什么方法进行计算,于是他又打道回府去拿到计算的方法,然后获得最后的结果返回给main,那么这里的Sub和Add都认为是回调函数。

4、钩子函数

一看到钩子(Hook)我们首先想到的动作就是挂钩,作者这里举个例子:今天要吃鱼,去河边钓鱼,于是我们准备好钓鱼竿,终于有鱼上钩了,一看原来是条小鱼,于是便放了,继续钓鱼,接着钓了条大鱼,于是收工回去吃大餐。

所以钩子函数看来就相当于一个监测器,在消息传递的过程中,捕获自己感兴趣的内容,然后去处理,钩子函数这个概念在消息机制中经常会提到的,它也是一个函数,一般是通过函数指针进行灵活的注册,这样一说,完了,分不清楚了,首先我们还是要选择好角度,不确定角度真的说不清。

大家可能会发现钩子函数也是用户定义的,是不是也可以理解为一个回调函数呢?形式上确实可以认为钩子函数也是一种回调函数,不过这样没有什么意义,我还可以说他们都是函数呢?还是要从函数的功能上区分,回调函数更多的是目的处理,而钩子函数更多的是过程监控,对于钩子函数的应用在rt-thread或者FreeRtos中都使用得非常多。

RT-Thread中截取的钩子函数代码参考:

RT-Thread通过一个宏定义来让用户决定是否开启钩子函数功能,上面每次进入中断都会调用对应的钩子函数,具体钩子函数根据自身需求进行设计,比如统计或者监控等等功能。

5、最后小结

好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地。同时非常感谢各位小伙伴的支持,我们下期精彩见!

推荐好文  点击蓝色字体即可跳转

☞【重磅】“整形数”还真没那么简单(C语言版)

☞ 【解惑】到底是"时间片"?还是"分时轮询"?

☞【经典】"有格调"的MCU初始化(绝对要get)

☞【重磅】剖析MCU的IAP升级软件设计(设计思路篇)

☞ 【典藏】别怪"浮点数"太坑(C语言版本)

☞GUI必备知识之“告别”乱码(浅显易懂)

☞【典藏】大佬们都在用的结构体进阶小技巧

☞听说因为代码没"对齐"程序就奔了?(深度剖析)

☞【典藏】自制小型GUI界面框架(设计思想篇)

c语言回调函数_【云里雾里】回调函数与钩子函数相关推荐

  1. mounted钩子函数_怎样实现Vue中mounted钩子函数获取节点高度

    这次给大家带来怎样实现Vue中mounted钩子函数获取节点高度,实现Vue中mounted钩子函数获取节点高度的注意事项有哪些,下面就是实战案例,一起来看一下. 遇到的问题 最近在开发一个Vue的项 ...

  2. matlab的tfdata函数_较全的matlab 命令和函数

    d 菱形 -- 虚线 ^ 向上箭头 3.可以用subplot(3,3,1)表示将绘图区域分为三行三列,目前使用第一区域.此时如要画不同的图形在一个窗口里,需要hold on. ============ ...

  3. python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数

    1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则: 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:" ...

  4. 原生js已载入就执行函数_手写CommonJS 中的 require函数

    前言 来自于圣松大佬的文章<手写CommonJS 中的 require函数> 什么是 CommonJS ? node.js 的应用采用的commonjs模块规范. 每一个文件就是一个模块, ...

  5. 未捕获typeerror: $形象。cropper不是函数_没有学不会的python--细说自定义函数的细节...

    没有学不会的python 函数是什么? 老调常谈,还是那老一套,学习一个东西前,先搞懂是什么,再来学习怎么用. 函数函数,如果你是刚经历过高考肯定很熟悉,数学中就经常出现这个名词,比如什么sin函数, ...

  6. python grid函数_详解numpy中的meshgrid函数用法

    numpy中的meshgrid函数的使用 numpy官方文档meshgrid函数帮助文档https://docs.scipy.org/doc/numpy/reference/generated/num ...

  7. matlab中floor函数,floor函数_怎么在excel中使用floor函数

    floor函数即上取整函数,是计算机C语言中的数学函数,与ceil函数相对应.但是它在excel中却是另一种含义,FLOOR函数是向下舍入为最接近指数基数的倍数,下面小编就教你怎么在excel中使用f ...

  8. python生成器函数_【python】生成器和生成器函数

    1.生成器函数: 普通函数: def func(): print("周杰伦") return "昆凌" func() #执行func()函数,"周杰伦 ...

  9. concat函数_三、P57-61 MySQL中常用函数

    本部分主要讲解MySQL数据库中常用函数的使用. P57 SQL中的函数类型:字符串函数.数值函数.日期和时间函数.流程函数.其他常用函数: P58 第1部分:字符串函数 1.concat函数 con ...

  10. 封装成vla函数_第四章:Python之函数

    第一节:函数入门与定义函数 理解函数 所谓函数,就是为一段实现特定功能的代码"取"个名字,以后即可通过该名字来执行(调用)这段代码 从逻辑上看,函数相当于一个黑匣子 定义函数的语法 ...

最新文章

  1. 独家 | Python中的SOLID原则(附链接)
  2. 鸿蒙系统全面解析,诞生背景、技术细节生态圈一文看懂
  3. ClassNotFoundException和NoClassDefFoundError的区别
  4. 3TB-GPT-MBR
  5. c include 多层目录_Rsync 秒杀一切备份工具,你能手动屏蔽某些目录吗?
  6. 003Java语言环境搭建
  7. php如何转类型,PHP数据类型转换
  8. Redis源码分析(一)redis.c //redis-server.c
  9. EasyOcr 安装(linux、docker)、使用(gin、python)
  10. python抽取指定url页面的title_Python使用scrapy爬虫,爬取今日头条首页推荐新闻
  11. SQL数据查询之——嵌套查询
  12. collectionutils包_基于springframework的集合处理工具类CollectionUtils对常见对象查找包含转换操作...
  13. Mysql的持久层_持久层(数据层,Dao层) MyBatis框架
  14. 星空粒子登录页面 jsp
  15. EPICS IOC Shell
  16. 小米笔记本锁屏睡眠无法唤醒修复方法
  17. 人员定位系统如何构建企业安全防护体系?
  18. 研究生如何进行文献的搜索和参考文献信息的搜寻
  19. java小数的数据类型_【填空题】Java 中小数默认的数据类型为 ,如果要指定为 类型,要在小数后面加F或f。...
  20. 【码云周刊第 10 期】放码过来,四个男人的带头冲锋!!(内附 PPT 下载链接)...

热门文章

  1. python连接数据库--查询数据
  2. Python内置函数(10)——float
  3. JMeter录制的两种方法
  4. WebForms简介
  5. Python操作SQLServer示例
  6. net.sf.json.JSONException: #39;object#39; is an array. Use JSONArray instead
  7. Ubuntu18.04安装wireshark3.0.6(版本可自己选)
  8. 从面向对象的api中识别软件组件(论文翻译)
  9. Idea下的springboot mysql8.0等报错解决随笔
  10. mysql一对多查询合并多的一方的数据。