失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 回调函数 —— 借助中间通用函数(形参里有函数指针 实现函数注册)调用不同的回调函

回调函数 —— 借助中间通用函数(形参里有函数指针 实现函数注册)调用不同的回调函

时间:2021-05-05 17:47:02

相关推荐

回调函数 —— 借助中间通用函数(形参里有函数指针 实现函数注册)调用不同的回调函

回调函数传参:函数指针做函数参数(回调函数)

目录

背景回调函数是实现函数分层且单向依赖的好办法,使用函数指针运行struct结构体回调函数代码更清晰简单理解回调函数Demo其他回调函数博文

背景

这是我在实际工作中遇到的问题:

线程创建 第三个参数 函数指针

完全不管具体实现什么功能,把地址传过来,完全分层,黑盒子

涂鸦:那个接口有我解析的代码,也有mcu调用者的代码,耦合在一起了

要完全分层,双方代码要放在不同的 .c 文件里面,互不干扰。

回调函数是实现函数分层且单向依赖的好办法,使用函数指针运行

回调函数是实现函数分层且单向依赖的好办法,使用函数指针运行:

视频讲解【回调函数和函数指针】干货分享,彻底摆脱回调地狱

实际工作中很常见的一种方法是,额外去写一个注册/安装函数:

传递参数,底层给上层传递参数:

同时上层也可以给底层一个返回值,实现数据双向的携带:

总结:

struct结构体回调函数代码更清晰

参考:C/C++ struct 的回调函数使用技巧

地址:/u010333084/article/details/51339469?spm=1001..3001.5502

回调函数是一个通过函数指针调用的函数。如果你把函数指针(函数的入口地址)传递给另一个函数,当这个函数指针被用来调用它所指向的函数时,我们就说这个函数是回调函数。可以作为函数参数传递哦。

使用struct 回调函数可以使得代码更加清晰明了.

1.定义回调函数的原型

typedef int STRU_FU;STRU_FU sfun1(int a, const char *b){printf("fun1 a = %d , b = %s \n",a,b);return a;}STRU_FU sfun2(int a, void *b,float c){printf("fun2 a = %d , b = %f \n",a,c);return a;}STRU_FU sfun3(int a, char b,long c){printf("fun3 a = %d , *b = %ld \n",a,c);return a;}

2. 定义的struct的回调函数

struct fun_ops{//定义回调函数structSTRU_FU (*fun1)(int a, char *b); //注册参数STRU_FU (*fun2)(int a, void *b,float c);STRU_FU (*fun3)(int a, char b,long c);};

3. 注册回调函数

struct fun_ops fuops = {//注册初始化函数指针的函数.fun1 = sfun1,.fun2 = sfun2,.fun3 = sfun3,};

4.完整的代码

#include <stdio.h>#include <string.h>#include <pthread.h>#include <stdlib.h>typedef int STRU_FU;STRU_FU sfun1(int a, const char *b){printf("fun1 a = %d , b = %s \n",a,b);return a;}STRU_FU sfun2(int a, void *b,float c){printf("fun2 a = %d , b = %f \n",a,c);return a;}STRU_FU sfun3(int a, char b,long c){printf("fun3 a = %d , *b = %ld \n",a,c);return a;}struct fun_ops{//定义回调函数structSTRU_FU (*fun1)(int a, char *b); //注册参数STRU_FU (*fun2)(int a, void *b,float c);STRU_FU (*fun3)(int a, char b,long c);};struct fun_ops fuops = {//初始化函数指针的函数.fun1 = sfun1,.fun2 = sfun2,.fun3 = sfun3,};int main(int argc, char* argv[]){int g;struct fun_ops *ops = NULL;if(argc < 2){printf("please input 1 or 2 or 3 for test fun \n");return -1;}if(strcmp(argv[1], "1") == 0){ops = &fuops;g =1;printf("fun1 \n");ops->fun1(111,"fun1");//调用回调}else if( !strcmp(argv[1], "2")){ops = &fuops;g= 2;printf("fun2 \n");ops->fun2(2222,"fun2",3333);}else{ops = &fuops;g = 3;printf("fun3 \n");ops->fun3(1212,'y',9999999);}}

简单理解回调函数

你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。

在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发回调事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件

通过上面的例子我们有了以下几点概念

主函数:相当于整个程序的引擎,调度各个函数按序执行

回调函数:一个独立的功能函数

中间函数(通用):一个介于主函数和回调函数之间的函数,登记回调函数,通知主函数,起到一个桥梁的作用

在中间函数调用回调函数的时候,我们需要把回调函数当作参数来传递,那么就需要用到函数指针,下面以一个例子来详细了解。

Demo

#include <stdio.h>//回调函数1 不同的调用者提供 类似多态int callBack1(int x){return x*2;}//回调函数2 不同的调用者提供 类似多态int callBack2(int x){return x/2;}//中间函数(通用)//函数指针int calc(int b,int (* func)(int)) //func把函数当作参数来进行传递{return 100+func(b);}int main(){int a=10;int q=calc(2,callBack1);//注册:把函数赋值给函数指针的操作就是函数注册printf("%d\n",q);int p=calc(4,callBack2);//注册&调用回调函数printf("%d\n",p);return 0;}

运行结果:

分析一下代码流程

1、主函数需要调用回调函数

2、中间函数登记回调函数

3、触发回调函数事件

4、调用回调函数

5、响应回调事件

其他回调函数博文

c语言回调函数的使用及实际作用详解

C语言回调函数详解(全网最全)

回调函数是什么,如何使用以及函数的注册

C语言 | 嵌入式重点知识之回调函数

在函数中调用函数,有点象递归,递归调用的是自己。

回调函数 —— 借助中间通用函数(形参里有函数指针 实现函数注册)调用不同的回调函数 (多态/分层)

如果觉得《回调函数 &mdash;&mdash; 借助中间通用函数(形参里有函数指针 实现函数注册)调用不同的回调函》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。