回调函数的定义
根据维基百科的定义:把一段可以执行的代码像参数一样传递给其他代码,这段可执行的代码会在某个时间点被调用执行,这个就叫回调;如果代码立刻执行就称为同步回调,如果代码在之后的某个时间点被执行,称为异步回调
C语言中函数的本质就是一段可执行的代码,如果使用函数指针,将本模块的函数传递到另外一个模块,由另外一个模块的代码执行,这个函数就是回调函数
回调函数的作用
回调函数的调用的原理本质上和普通的函数调用是一致的,可以理解在回调函数执行的地方,如果直接使用回调函数的函数名做调用,效果是一致的;本质是一个更加灵活的函数调用
回调函数的主要作用是解耦合
![](https://img.haomeiwen.com/i16401219/863a5ff409a6a708.jpg)
主程序将回调函数作为参数传递给库函数,只要改变传递给库函数的参数,就可以实现不同的功能,并且完全不需要改变库函数的功能,这个就是解耦合的含义
库函数和主程序一般不属于一层或者一个模块,库函数是按照通用性设计的,不知道主程序会用什么样的函数处理;也就是说不能通过修改库函数调用普通函数的方式实现,那我们就只能通过参数传入不同的回调函数了
回调函数的基本结构
同步回调一种形式:使用函数指针将回调函数传入B模块,B模块没有保存函数指针的内容,在函数体内立刻调用
//module_A
uint32_t Callback(uint32_t a) {
.......
}
maindatdaflow(uint32_t a, Callback);
//module_B
typedef uint32_t (*stdfunction)(uint32_t p);
maindatdaflow(uint32_t a, stdfunction f) {
uint32_t temp = xxx;
....
f(temp)
}
异步回调的一种形式,区别在于会将回调函数保存,之后在合适的地方调用它
//module_A
uint32_t Callback(uint32_t a) {
.......
}
register_callback(Callback);
//module_B
typedef uint32_t (*stdfunction)(uint32_t p);
stdfunction callBack;
register_callback(stdfunction f) {
callBack = f;
}
run () {
....
run(callBack)
}
回调函数使用过程中,回调函数是在主程序中定义,所以可以使用主程序的全局变量和相关函数,在通用库主体中被调用,所以通用库只能通过回调函数实参和主程序共享数据
回调函数的参数讨论
实际的Callback 函数都会带一个万能指针类型的参数,原型如下:
uint32_t Callback(uint32_t a, void* userData) {
.......
}
void* userData 就是库函数传给主程序的数据内容指针,这部分内存的分配可以是从主程序中分配:即在注册Callback 的时候传给给它,此时register_callback 要改成下面的形式
register_callback(stdfunction f,void* p)
库函数本质只是做一个透传
也可以直接在 库函数中分配,传递给它
网友评论