回调函数

------------恢复内容开始------------

回调函数

上网查了很多资料,对回调函数可以这样理解:

  你使用标准库的函数,可以称作直接调用函数,在你的程序中调用系统的函数。

  而回调函数,就是反过来,让系统调用你的函数的一种形式。

在前2篇博客中我提到了函数指针和指针函数,其中在讲函数指针的时候,提到了将函数的指针作为参数传入另一个函数的例子,这就是回调函数。

举一个简单的例子:

#include <stdio.h>

void apple(void)
{
    printf("i love apple
");
}

void orange(void)
{
    printf("i love orange
");
}

void blue(void)
{
    printf("i love blue
");
}


void callback(void (*p)(void))
{
    return p();
}


int main(int argc, char const *argv[])
{
    callback(apple);
    callback(orange);
    callback(blue);
    return 0;
}

在这个函数中,我们定义了3个普通函数,分别是apple orange blue,他们三个函数的类型是相同的

所以在函数callback中,我们又传入了一个同样类型的指针作为参数,这样通过该函数即可以调用其余同类型的函数。

还是昨天的例子,我们看一下简单计算器的实现:

#include <stdio.h>

//定义了一个指针类型
typedef int (*pFunc)(int,int);

struct cal_t
{
    int a;
    int b;
    pFunc p;    //结构体里面有一个指针,刚才定义过的指针类型
};

int calculator(const struct cal_t *ptr);

int calculator(const struct cal_t *ptr)
{
    return ptr->p(ptr->a,ptr->b);
}

int add(int a,int b)
{
    return a + b;
}

int sub(int a,int b)
{
    return a - b;
}

int mul(int a,int b)
{
    return a * b;
}

int div(int a,int b)
{
    return a / b;
}


int main(int argc, char const *argv[])
{
    int ret = 0;
    struct cal_t myCal;

    myCal.a = 12;
    myCal.b = 4;
    myCal.p = div;

    ret = calculator(&myCal);
    printf("ret = %d
", ret);
    
    return 0;
}

首先定义了一个结构体,其实结构体里面就是后面实现函数所需要的参数,然后把结构体作为参数传入回调函数中

注意,函数也作为指针存在结构体中,然后通过主函数给结构体的成员赋值,实现对函数的调用

  

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/qifeng1024/p/12466540.html