没有合适的资源?快使用搜索试试~ 我知道了~
我们在使用C语言实现相对复杂的软件开发时,经常会碰到使用回调函数的问题。但是回调函数的理解和使用却不是一件简单的事,在本篇我们根据我们个人的理解和应用经验对回调函数做简要的分析。 1、什么是回调函数 既然谈到了回调函数,首先我们就要搞清楚什么是回调函数。在讨论回调函数之前,我们需要说明另一个概念,那就是函数指针。什么是函数指针呢?说的浅显一点,函数指针就是指向函数的指针,说白了也是一种指针,只是它指向的不是整型,字符型等数据量,而是指向函数。在C中,每个函数在编译后都是存储在内存中,并且每个函数都有一个入口地址,根据这个地址,我们便可以访问并使用这个函数。函数指针就是指向这个入口地址,从而
资源详情
资源评论
资源推荐
C语言语言 回调函数详解回调函数详解
我们在使用C语言实现相对复杂的软件开发时,经常会碰到使用回调函数的问题。但是回调函数的理解和使用却不是一件简单
的事,在本篇我们根据我们个人的理解和应用经验对回调函数做简要的分析。
1、什么是回调函数、什么是回调函数
既然谈到了回调函数,首先我们就要搞清楚什么是回调函数。在讨论回调函数之前,我们需要说明另一个概念,那就是函
数指针。什么是函数指针呢?说的浅显一点,函数指针就是指向函数的指针,说白了也是一种指针,只是它指向的不是整型,
字符型等数据量,而是指向函数。在C中,每个函数在编译后都是存储在内存中,并且每个函数都有一个入口地址,根据这个
地址,我们便可以访问并使用这个函数。函数指针就是指向这个入口地址,从而调用这个函数。
同样回调函数就是一个通过函数指针调用的函数。如果我们把函数的指针(指向函数入口地址)作为参数传递给另一个函
数,而接收这个参数的函数在其运行过程中,反过来使用这个指针调用其所指向的函数,我们就把这个被通过函数指针调用的
函数称之为回调函数。
从上述描述我们可以知道,回调函数有别于一般意义上的函数调用方式。它一般不是由该函数的实现方直接调用,而是由
已经存在的其它对象间接调用它。而且回调函数的调用是调用方所需要的,但是其具体实现却是非常灵活的,我们可以根据需
要来实现它,只要调用的格式相符,我们不需要去考虑调用他的对象的具体内容。
2、为何使用回调函数、为何使用回调函数
前面我们简单介绍了回调函数,那我们为什么需要使用回调函数呢?既然是用它,当然是有使用的理由。接下来我们简单
的讨论一下使用回调函数的优势所在。
首先,可以使上层的应用更完整,但又不需要考虑底层的实现细节。比如我们设计了一个通讯应用,但在设计时我并不能
确定底层接口,或者说不想局限于某一接口。那么我们可以将接口部分的实现留在具体使用中,所以采用回调函数的方式就非
常方便。
其次,可以使应用更加灵活,这是显而易见的。比如我们设计一个通讯协议栈,这个协议栈在什么平台使用并不局限,我
们使用回调的方式具体实现平台相关部分,而协议栈的内核这可以使用于多种平台。
再者,可以把调用者与被调用者分开,这样调用者不关心谁是被调用者,也不关心他的具体实现。使得软件的设计更加独
立,方便与协作或者移植。其实细说起来还有很多,在此仅列举上述几点。
3、如何使用回调函数、如何使用回调函数
我们已经简单的介绍了什么事回调函数以及为什么要使用它,接下来我们说说怎么使用它。对于使用方式千差万别,而且
每个使用者都有相应的心得,在这里我们之宗解一下我们平时常用的几种方式。
3.1、以函数参数的形式使用、以函数参数的形式使用
在大多数情况下,我们可能都是将函数指针作为参数传递给调用者来实现回调。比如我们声明如下函数:
void function1(int var1,int var2)
void function2(void *fc(int,int),float a,int b)
调用时咋使用function2(function1,a,b)就可以了。当然还有另一个函数与function1的声明形式一致,也一样可以做
为参数传递给function2函数。
这种方式最好理解,而且函数名不受限制,只要声明形式一致就可以了。我们在外设驱动的调用上会使用这一形式。
3.2、以弱化定义的方式使用、以弱化定义的方式使用
所谓弱化函数就是调用者以_weak定义一个没有操作或者默认操作的函数,该函数允许定义与其名称和形式完全一样的函
数。若使用者重新定义了该函数则会调用新函数,否则使用_weak修饰的默认函数。在STM32的HAL库中使用了很多这样的
函数,比如各种msp函数。
首先需要有一个以_weak修饰的函数声明:
__weak void SetSingleCoil(uint16_t coilAddress,bool coilValue)
而在使用时定义一个与其同名且形式一样的函数:
void SetSingleCoil(uint16_t coilAddress,bool coilValue),具体个功能有使用者更具需要设定。如上述这个函数就是我们
在调用Modbus协议栈时实现的,每次都不一样,根据需求而定。
这种方式使用虽然方便,但有一个局限就是必须与原函数声明一致,且只能有一个。
3.3、以函数注册的方式使用、以函数注册的方式使用
weixin_38661128
- 粉丝: 4
- 资源: 887
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 常用工具集参考用于图像等数据处理
- 音乐展示网页、基于Stenography的图像数字水印添加与提取,以及基于颜色矩和Tamura算法的图像相似度评估算法py源码
- 基于EmguCV(OpenCV .net封装),图像数字水印加解密算法的实现,其中包含最低有效位算法,离散傅里叶变换算法+文档书
- 基于matlab+DWT的图像水印项目,数字水印+源代码+文档说明+图片+报告pdf
- (优秀毕业设计)基于python实现的数字图像可视化水印系统的设计与实现,多种数字算法实现+源代码+文档说明+理论演示pdf
- 基于DWT-DCT-SVD和deflate压缩的数字水印方法python源码+Gui界面+演示视频(高分毕业设计)
- 基于matlab实现DWT、DCT、SVD算法数字图像水印可视化系统+GUI界面+文档说明+详细注释(高分毕业设计)
- NCIAE-Data-Structure大一大二笔记
- 学习wireshark笔记
- digital-image-数据可视化笔记
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0