回调函数如何使用-函数指针
给函数指针赋值,该函数指针变量就获得了这个函数的入口地址,就是指向了add函数的入口地址,它就代表了add这个函数。就可以等同于add函数,直接传参调用即可。
函数指针的作用:同一个函数指针变量,可以指向不同的函数
#include <stdio.h>
int add(int a, int b) {return a+b;}
int sub(int a, int b) {return a-b;}
typedef int (*op)(int, int);
int main(){
op pfunc = add; // 定义函数指针变量,类型是op,赋值为add
printf("%d\n", pfunc(4, 2));
pfunc = sub;
printf("%d\n", pfunc(4, 2));
return 0;
}
回调函数就是一个函数指针,回调函数的形式。
- 将函数A作为一个参数(函数指针)传递给另一个函数,由该函数在稍后调用函数A,这样的函数A就是一个回调函数(CallBack)
- 它在运行的时候才知道会调用哪个接口,执行什么功能
#include <stdio.h>
int add(int a, int b) {return a+b;}
int sub(int a, int b) {return a-b;}
typedef int (*op_callback)(int, int);
int calc(op_callback callback, int x, int y){
return callback(x, y);
}
int main(){
printf("%d\n", calc(add, 4, 2));
printf("%d\n", calc(sub, 4, 2));
return 0;
}
回调函数的本质,让一个封装好的程序模块有部分可自定义的功能
- 举例1:LVGL中自定义按键按下的功能
按键这个模块是LVGL封装好的,你按键按下后要实现什么功能,跟按键本身的实现没有关系,但是 LVGL它又必须要把按键作为一个封装,就不可能把按键需要实现什么功能写在这个封装里面。哪怎么做?它就是给的回调函数的接口由用户来自定义按键按下需要执行的功能。- 具体看LVGL demo 里面的 lv_obj_add_event_cb 接口,该接口用来添加按键的事件回调的。
- 举例2:STM32 HAL库中的中断回调
每个外设的中断都留有一个中断回调函数的接口。如定时器中断回调接口 HAL_TIM_PeriodElapsedCallback 表示每个定时器中断结束后都会触发中断,调用这个接口。
浙公网安备 33010602011771号