回调函数
------------恢复内容开始------------
回调函数
上网查了很多资料,对回调函数可以这样理解:
你使用标准库的函数,可以称作直接调用函数,在你的程序中调用系统的函数。
而回调函数,就是反过来,让系统调用你的函数的一种形式。
在前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; }
首先定义了一个结构体,其实结构体里面就是后面实现函数所需要的参数,然后把结构体作为参数传入回调函数中
注意,函数也作为指针存在结构体中,然后通过主函数给结构体的成员赋值,实现对函数的调用
------------恢复内容结束------------