使用場景: 如果本人要調用別人的庫,而別人的庫有時需要數據主動給本人,這時可以需要用到回調函數。
別人的庫 假設是 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頭文件。