函数指针有啥用?有啥意义?
函数指针有啥用?有啥意义?-说来奇怪,昨晚睡觉前,突然在想一个问题
很久没写烧脑文了,今天来写一篇。
说来奇怪,昨晚睡觉前,突然在想一个问题:函数指针有啥用?有啥意义?
起源是之前有个学员问我这个问题,但是感觉当时回答得不是特别好。
(资料图)
有些东西就是这样,自己知道该怎么用,用在哪,但如果一下子让我很通俗易懂地表达出来,脑子就卡壳了。
昨晚夜深人静,我想到了正好我们wifi报警主机那个项目有个例子,非常适合去深刻理解。
这个项目我们对接的是涂鸦云平台,然后涂鸦云提供SDK,我们需要移植到我们自己的项目里去。
在移植的过程中,我们需要去更改他们SDK里面的代码,我觉得这点是可以优化的。
下面给大家举一个具体的例子:
比如我们使用的涂鸦云提供的WiFi模组,通过串口和我们单片机连接,有一个通讯协议,但是涂鸦云帮我们做好了这个通讯协议的代码,所以会提供一个SDK给我们。
我们在使用SDK的时候,需要修改SDK的代码,把我们这款单片机的串口发送一个字节的函数,移植到SDK里面去。
Hal_Wifi_SendByte函数是STM32的串口发送一个字节函数。
我们要把这个函数放到涂鸦云SDK protocol.c文件的usart_transmit_output函数里面去。
最终SDK是调用usart_transmit_output函数实现串口数据流发送功能。
Ok,我们现在思考一下,这种方式有什么问题?如何解决?
问题1:
如果采用这种方式,有一种功能实现不了,就是假设涂鸦云这个SDK要封库(lib文件),源码不开放,我们就没法把Hal_Wifi_SendByte放到protocol.c文件的usart_transmit_output函数里面去。
是不是会有这个问题?这意味着,protocol.c必须开源,但是很多企业有一些核心代码,是商业机密,不能开放的,比如做导航的地图数据库。
问题2:
客户的技术水平层次不齐,如果有些基础稍微差点的,把SDK改乱了,这样会增加涂鸦云技术支持的人工成本。
所以,如果我去做,最理想的是不让客户改SDK的任何代码,你就直接按照我的方法和流程,调用函数用。
怎么解决这个问题?那就必须要用函数指针了!记住,是必须!
第一步:在protocol.h文件下自定一个函数指针类型pUart_transmit_output。
第二步:在protocol.c定义一个函数指针变量Uart_transmit_outputCBS。
第三步:修改protocol.c文件下uart_transmit_output函数,直接调用刚刚定义的函数指针变量Uart_transmit_outputCBS,记住调用前,必须要指针不为空的条件判断,否则,如果指针调用前没正确指向,会造成指针异常,程序死机。
第四步:在protocol.c文件下编写Uart_transmit_outputCBS函数指针的注册函数,也就是让这个函数指针变量指向一个地址的函数接口。
为什么要单独写个函数呢?因为我们理想的情况下,是提供函数接口,给别的.c文件调用,而不是用全局变量的形式。
第五步:别忘记在protocol.h文件下声明下Uart_transmit_outputCBSRegister函数,否则别的.c文件无法调用这个函数。
第六步:在我们单片机串口驱动文件hal_usart.c的初始化函数hal_UsartInit里面调用Uart_transmit_outputCBSRegister函数,然后把hal_Wifi_SendByte函数地址作为形参传递进去。
当然,在此之前别忘记在hal_usart.c文件的开头include SDK相关头文件。
最终分析:这样操作完以后,结果会是怎样?
Protocol.c文件下,调用uart_transmit_outputCBS函数指针时,是不是等同于调用hal_usart.c的hal_Wifi_SendByte函数?
这就是函数指针的作用,这样就能实现,客户不修改SDK代码,SDK也能调用客户工程下.c文件里的函数了。
这些技巧不复杂,就像纱窗,有人指点一下,很快就捅破了,没人指点,可能很多年都领悟不了,这也是进阶架构师必须要掌握的技巧。
审核编辑:汤梓红
关键词:
函数指针有啥用?有啥意义?-说来奇怪,昨晚睡觉前,突然在想一个问题
早盘主力买进前10股,一文看清主力动向。
农业农村部农情调度显示,全国早稻收获基本结束。今年,早稻种植面积稳
8月3日,北元集团(601568)融资买入259 69万元,融资偿还324 76万元,
重庆警方近期侦破一起特大网络直播跨境赌博案,查证涉案资金流水4亿多
商报全媒体讯(椰网 海拔新闻记者陈王凤)海南省气象局2023年8月4日6时
KGQ7矿用氧气传感器是一种智能型检测仪表,所有调校功能均可通过遥控器
记者从国网石家庄供电公司获悉,到8月2日23时30分,随着平山县合河口乡
刚刚过去的7月,世界各地极端天气伴随着前所未有的高温,让人们对全球
防汛抗旱关键期叠加季节性灾害高峰期我省8月须预防高温热害和干旱缺水-
TruistSecurities:维持JFrog(FROG US)评级,由买入调整至买入评级,目
残疾人家庭进行无障碍改造,是提高残疾人生活质量,解决残疾人家庭劳动
00:40“湖平人健,意思是湖面平静,人们健康生活。湘滋两地因湖泊结缘
8月3日,盐津铺子(002847)披露2023年中报。公司上半年实现营收18 94亿
欧盟8月3日声明称,将采取新措施,扩大对白俄罗斯的制裁范围,新措施统
中新网北京8月3日电 (记者 高凯)据灯塔专业版数据,截至记者发稿
深蓝S7累计交付9197辆,长安新能源增长62 8%,新能源,增程式,长安汽车,
封面新闻记者粟裕8月3日,北京互联网法院举行涉网络暴力新闻发布会,通
1、歌曲:客官不可以歌手:徐良L&小凌小凌:客官不可以你靠的越来越近你
0471房产来为大家解答以上的问题。习语ldquo什么什么前面这个很多人还