一、前言
回调函数是一种去耦合的技巧。
从语法的角度来看,callback好像平凡无奇,甚至有点多此一举。但从软件架构的角度来看,这种技术就十分有意义,我觉得理解callback这么一种技术不能单纯从语法的角度理解,要站得高一点才能看清它的价值。
比如学习c语言,初学者是线性的思维,main函数从头到尾跑完,看代码也很简单,从头到尾看一遍就行。加上了callback之后,软件运行时的顺序就有点复杂了,这种复杂是设计出来的,是为了带来更多结构上的好处。
二、场景举例
1. 原始接口:
//其他模块或其他层的接口如下:
void BT_Link_cb(tMY_Struct *para);
2. 使用方法:
1、定义函数指针:typedef
typedef void (* My_callback)(tMY_Struct *para);
2、声明函数指针,它可以代替函数;
My_callback s_my_callback = NULL;
3、可以使用函数指针替换函数,但此时函数指针是没有实现、没有意义的;
4、声明callback注册函数;
void App_Register_My_CB(My_callback callback);
void App_Register_My_CB(My_callback callback)
{
if(callback != NULL) {
s_my_callback = callback;
}
}
5、给callback赋值,BT_Link_cb是其他模块或其他层的接口;
App_Register_My_CB(BT_Link_cb);
6、使用时:
if(s_my_callback != NULL) {
s_my_callback(local_para); //传递当前的数据
}
3. 好处:
1、可以用于跨层与跨模块的数据传递;