我所理解的回調函數

什麼是回調函數:回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作爲參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

比如:有兩個人,一個人負責買菜,一個人負責炒菜。炒菜的人得等買菜人的把菜買過來放到廚房裏面,才能開始炒菜,至於炒這道菜是酸,是甜,是苦,是炒菜的人說了算,去實現的,跟買菜的人沒有關係,買菜的人只需要提供食材就好了。那麼在回調函數中,寫回調函數的人就相當於買菜的人,調用函數回調的人相當於炒菜的人。寫回調函數的人,在事件發生的時候通知這個事件,並把需要的用到的值(食材)也一起傳過去,調用回調函數的人知道這件事情發生了,他就可以用這些值(食材)去實現他想實現的功能。

寫回調函數的人(買菜的人):

第一步:定義回調函數類型
typedef void (*GetInfoCallBack)(ingredients_info_t* info);

第二步:定義回調函數類型的函數
GetInfoCallBack get_info_callback = NULL

第三步:把這個回調函數地址傳到你獲取信息(食材)的接口函數
get_info_ingredients(GetInfoCallBack callock);

第四步:把第三步的回調地址給第二步的回調函數
get_info_ingredients(GetInfoCallBack callock)
{
    get_info_callback = callock;
}

第五步:把你獲取的信息(食材)通過這個回調函數傳出去,給要這些信息的人(炒菜的人)
(get_info_callback)(&info);

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>


typedef struct{
    char fish[64];
    char Pork[64];
    char Greens[64];
    int state;
}ingredients_info_t;

//第一步,定義回調函數類型
typedef void (*GetInfoCallBack)(ingredients_info_t* info); //一般在.h裏面定義
//第二步:定義回調函數類型的函數
GetInfoCallBack get_ingredients_callback = NULL;  //一般在.c裏面定義

//第三步:把這個回調函數地址傳到你獲取信息(食材)的接口函數
int get_info_ingredients(GetInfoCallBack callock)
{
    //第四步:把第三步的回調地址給第二步的回調函數
    get_ingredients_callback = callock;

    //買菜,獲取食材
    ingredients_info_t info;
    memset(&info, 0, sizeof(ingredients_info_t));
    strcpy(info.fish, "fish");
    strcpy(info.Pork, "Pork");
    strcpy(info.Greens, "Greens");

    info.state = 1;//當值爲1時,說明該事件發生了;菜已經買回來了

    //第五步:把你獲取的信息(食材)通過這個回調函數傳出去,給要這些信息的人(炒菜的人)
    (get_ingredients_callback)(&info);

}

調用回調函數的人(炒菜的人)

第一步,調用接口註冊一個回調函數

第二步,當獲取到信息時(食材),實現回調內容


//第二步,當獲取到信息時(食材),實現回調內容
void Stir_fry_callnack(ingredients_info_t *info)
{
    if(info->state == 1){
        printf("我要開始做:%s\n", info->fish);
        printf("我要開始做:%s\n", info->Pork);
        printf("我要開始做:%s\n", info->Greens);
    }
}

int main(int argc, char const *argv[])
{
    //第一步,調用接口,並註冊一個回調函數
    get_info_ingredients(Stir_fry_callnack);
    return 0;
}

調用的結果如下:

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