打印
[技术讨论]

回调函数和直接调用函数有什么区别?

[复制链接]
1202|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
昊430|  楼主 | 2022-3-25 21:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己在百度和知乎上搜索了一番,感觉也没看明白,回调函数只是将要应用的函数指针赋值给一个响应的函数指针变量,与直接调用有什么区别呢?
比如有两个函数void funa()     void funb()
直接调用就是
funa();
funb();
顺序执行
但是函数调用就是将函数指针作为形参传入一个函数
如:funa(funb)
这样调用是有什么好处吗?



使用特权

评论回复

相关帖子

沙发
elife| | 2022-3-25 21:47 | 只看该作者
回调函数一般是系统或框架来调用的,使用者只要在函数内写入自己需要的功能,当然要清楚回调函数是什么状态下被调用的,函数运行时的环境。至于函数用指针来调用,好处是可以把函数组成功能集合,根据不同需求调用不同函数。

使用特权

评论回复
板凳
昊430|  楼主 | 2022-3-26 08:42 | 只看该作者
elife 发表于 2022-3-25 21:47
回调函数一般是系统或框架来调用的,使用者只要在函数内写入自己需要的功能,当然要清楚回调函数是什么状态 ...

执行顺序上来说两者是没有去别的是吧

使用特权

评论回复
地板
LcwSwust| | 2022-3-26 10:22 | 只看该作者
我觉得可以这么理解:
比如你做了一套通用的绘图算法如"GUI.c",多个项目都可使用,其中会用到一个描点函数 lcd_pset(x,y,color),但是实物中不同型号的的LCD描点函数也不同,难道每改个型号就改一下"GUI.c"?万一又添加了新功能,那么改来改去都不知道哪个版本是最新的。
若用回调函数,则将 lcd_pset(x,y,color)放入主程序,然后将函数的指针传递给"GUI.c"中的某个函数就行,不同型号的LCD只需修改主程序而不需修改"GUI.c"。

使用特权

评论回复
5
csdnpurple| | 2022-3-26 11:25 | 只看该作者
本帖最后由 csdnpurple 于 2022-3-26 11:30 编辑

要体会回调函数,必须将其放到具有动态装配软件模块的系统中才可以显现出来,比如windows linnux等,不同的软件模块是分别编译的,由于软件的维护方便将软件的调用搞成回掉函数后是软件的调用地址可以通过管道、总线、内存等相对固定的通讯方式传递,试想两个独立编译的软件模块中的函数AB相互调用,A并不知道B的编译链接系统加载后的内存地址位置,如果B软件模块将B函数的地址在软件启动时放在指定的内存位置A就可以获得B的地址可以调用了,当然B的地址可以通过很多其他方法传递,但都必须将B作为数据传递才行。如果看不懂上面的描述,要进一步了解计算机体系结构、操作系统(包括软件模块的动态加载的系统,软件模块在内存中结构)、编译原理(obj文件格式exe文件格式)。

使用特权

评论回复
6
昊430|  楼主 | 2022-3-26 14:28 | 只看该作者
csdnpurple 发表于 2022-3-26 11:25
要体会回调函数,必须将其放到具有动态装配软件模块的系统中才可以显现出来,比如windows linnux等,不同的 ...

感谢解答,但是单片机上也经常有这种应用,不太懂他的好处

使用特权

评论回复
7
csdnpurple| | 2022-3-26 21:22 | 只看该作者
昊430 发表于 2022-3-26 14:28
感谢解答,但是单片机上也经常有这种应用,不太懂他的好处

1、根据你的描述,我猜是因为开源的代码移植时带过来的,这样改动最小,或者是跨平台代码由于要照顾需要软件二进制模块适配需要软件结构要设计成你看到的样子。好处代码建造效率高
2、在最优运行速度、最优功耗场景下,在有些mcu平台下,回掉函数要比直接调用快。
3、如果AB两个工程师共同完成一个mcu的软件编写任务,但相互不能查看源代码,并各自分配了一块mcu存储器地址,要求各自编译成hex并直接烧录就可以正常运行,使用回掉函数是一个解决方案。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

975

帖子

5

粉丝