我所理解的回调函数

什么是回调函数:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

比如:有两个人,一个人负责买菜,一个人负责炒菜。炒菜的人得等买菜人的把菜买过来放到厨房里面,才能开始炒菜,至于炒这道菜是酸,是甜,是苦,是炒菜的人说了算,去实现的,跟买菜的人没有关系,买菜的人只需要提供食材就好了。那么在回调函数中,写回调函数的人就相当于买菜的人,调用函数回调的人相当于炒菜的人。写回调函数的人,在事件发生的时候通知这个事件,并把需要的用到的值(食材)也一起传过去,调用回调函数的人知道这件事情发生了,他就可以用这些值(食材)去实现他想实现的功能。

写回调函数的人(买菜的人):

第一步:定义回调函数类型
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;
}

调用的结果如下:

猜你喜欢

转载自blog.csdn.net/weixin_42432281/article/details/104563163
今日推荐