使用场景: 如果本人要调用别人的库,而别人的库有时需要数据主动给本人,这时可以需要用到回调函数。
别人的库 假设是 a.h 和a.C
自己的文件是 b.h和b.c
在a.h和a.c里面需要完成的是两个步骤:
(1)
a.h里面
定义回调函数指针
typedef INT32(*reporttaskdata_callback)(UINT8 op_type,UINT8 *pdata);
初始化,此函数需要被b.c文件中一开始调用,把相应的具体实体函数传给他。
VOID reportdata_callback_init(reporttaskdata_callback reportdataproc);
a.c里面
reporttaskdata_callback reportdate_callback_func;
VOID reportdata_callback_init(reporttaskdata_callback reportdataproc)
{
reportdate_callback_func= reportdataproc;
}
a.C文件执行回调函数时这样调用就相当于执行b.C的实体函数了。
reportdate_callback_func(op_type, (UINT8 *)&(recv_data[0]));
(2) b.c里面需要包含 #include "a.h"
INT32 Function_entity (UINT8 op_type,UINT8 *pdata)
{
/*函数实体 执行相关函数操作*/
}
在程序一开始运行时 调用 a.h里面的reportdata_callback_init,相当于把函数实体传给了a文件的reportdate_callback_func指针
reportdata_callback_init(Function_entity);
1 首先在 在一个头文件中定义 比如 timer.h
typedef VOID (*timerproc)(UINT32 arg, UINT8 type,UINT32 next_executetime);
2 在另外一个文件的c文件addrdmetertask中 写函数原型
timerproc rdmeter_timer_proc()
{
return rdmeter_settask2timer;
}
VOID rdmeter_settask2timer(UINT32 arg, UINT8 type,UINT32 next_executetime)
{
rdmeter_add_collectTask(arg,type,next_executetime);
}
3 timerproc proc;
(*proc)(p->arg, p->type,p->nextstart);//此函数等同于开始执行 rdmeter_add_collectTask(arg,type,next_executetime);
}
注意总结:(1) 在addrdmetertask文件中要引用 头文件timer.h,因为 timerproc在timer.h定义。
(2)timer.h不需要包含 addrdmetertask.h文件,并且 timerproc rdmeter_timer_proc()此函数不需要再写 入 addrdmetertask.h头文件。