------------ 恢复内容开始 ------------
回调函数
上网查了很多资料, 对回调函数可以这样理解:
而回调函数, 就是反过来, 让系统调用你的函数的一种形式.
在前 2 篇博客中我提到了函数指针和指针函数, 其中在讲函数指针的时候, 提到了将函数的指针作为参数传入另一个函数的例子, 这就是回调函数.
举一个简单的例子:
- #include <stdio.h>
- void apple(void)
- {
- printf("i love apple\n");
- }
- void orange(void)
- {
- printf("i love orange\n");
- }
- void blue(void)
- {
- printf("i love blue\n");
- }
- 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\n", ret);
- return 0;
- }
首先定义了一个结构体, 其实结构体里面就是后面实现函数所需要的参数, 然后把结构体作为参数传入回调函数中
注意, 函数也作为指针存在结构体中, 然后通过主函数给结构体的成员赋值, 实现对函数的调用
------------ 恢复内容结束 ------------
回调函数
来源: http://www.bubuko.com/infodetail-3457570.html