什麼是回調函數:回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作爲參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
比如:有兩個人,一個人負責買菜,一個人負責炒菜。炒菜的人得等買菜人的把菜買過來放到廚房裏面,才能開始炒菜,至於炒這道菜是酸,是甜,是苦,是炒菜的人說了算,去實現的,跟買菜的人沒有關係,買菜的人只需要提供食材就好了。那麼在回調函數中,寫回調函數的人就相當於買菜的人,調用函數回調的人相當於炒菜的人。寫回調函數的人,在事件發生的時候通知這個事件,並把需要的用到的值(食材)也一起傳過去,調用回調函數的人知道這件事情發生了,他就可以用這些值(食材)去實現他想實現的功能。
寫回調函數的人(買菜的人):
第一步:定義回調函數類型
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;
}
調用的結果如下: