回調函數的使用總結(非常重要)

使用場景:  如果本人要調用別人的庫,而別人的庫有時需要數據主動給本人,這時可以需要用到回調函數。

別人的庫 假設是 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頭文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章