1、回调函数
回调函数
本质上也是普通函数,只是调用机制有所区别:
- 首先,通过传参的形式将该函数的地址传递给其他函数;
- 然后,在其他函数中通过函数指针调用该函数;
那么在其他函数中通过函数指针调用该函数的过程就称为:回调
。
而作为被调用的该函数则被称为回调函数
。
In computer programming, a callback is any executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at a given time. This execution may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback.
即:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,就叫做回调。
如果代码立即被执行就称为同步回调,如果在之后晚点的某个时间再执行,则称为异步回调。
2、回调函数用法
以服务SDK
和用户
双方通信为例进行分析:用户
希望随时得到服务SDK
解析的OSR数据;该过程需要用回调逻辑实现,因为只有服务SDK
才知道啥时候有新的OSR数据注入,而用户
并不知道(虽然用户才是需求方);
//服务SDK侧,获取OSR数据的回调函数定义
typedef void (*SDK_Callback_GetDiffData)(char* buff,
uint32len);
//用户侧,获取OSR数据函数的代码(该函数即为回调函数)
//回调函数的参数列表来自于需求方(即服务SDK)
void User_GetDiffData(char* buff, uint32len)
{
///用户负责函数具体实现,
//如将服务SDK侧注入的OSR数据存储在用户自定义的数据结构内
}
实际应用回调函数时按如下逻辑:
【1】用户侧
进行服务SDK
初始化,将回调函数User_GetDiffData
函数的地址赋值给服务SDK
,以便后者随时调用,此时服务SDK
侧的SDK_Callback_GetDiffData = User_GetDiffData
【2】服务SDK
在解析到新OSR数据后,将调用SDK_Callback_GetDiffData
来给用户
注入OSR数据至用户定义的数据变量
内;
3、回调函数的个人理解
上述OSR数据获取过程采用回调函数
的原因:
- 因为
数据变量
是用户定义的,不同用户肯定不同,所以才用回调函数,因为回调函数体是用户自己实现的,自然就知道怎么数据交互; - 若采用
接口函数
,服务SDK
与用户
必须约定清楚双方的数据交互的数据接口,这导致服务SDK
跟用户
绑定,而起不到通用的作用!
关于回调函数更多内容,可参见以下2篇博客:
【1】什么是回调函数?为什么要使用回调函数?如何使用回调函数?
【2】C++:函数:回调函数:还不懂回调函数来捶我(二)