学科分类
目录
C语言

回调函数

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

回调函数的使用示例代码如下:

void func(int (*p)(int,int),int b,int c);

上述代码中,func()函数的第一个参数p是一个函数指针,它作为函数func()的参数使用,在func()函数内部可以回调p指向的函数。

回调函数在大型的工程和一些系统框架中很常见,如在服务器领域使用的Reactor架构、MFC编程中使用“句柄”等都是回调函数的应用。回调函数存在的意义是在特定条件发生时,调用方对该条件的即时响应处理。

下面通过一个案例演示回调函数的使用,具体如例1所示。

例1 callback.c

 1    #include <stdio.h>
 2     int plus(int a, int b)        //定义相加函数
 3     {
 4         return a + b;
 5     }
 6     int minus(int a, int b)    //定义相减函数
 7     {
 8         return a - b;
 9     }
 10     int times(int a, int b)    //定义相乘函数
 11     {
 12         return a * b;
 13     }
 14     // 定义函数,通过函数指针参数调用函数(回调)
 15     int func(int(*p)(int, int), int b, int n)
 16     {
 17         int result = 0;
 18         for (int i = 0; i < n; i++)
 19         {
 20             result += p (i, b);    //回调函数指针p指向的函数
 21         }
 22         return result;
 23     }
 24     int main()
 25     {
 26         int result;
 27        //定义指向plus()、minus()、times()函数的函数指针
 28        int (*pplus)(int, int) = plus;
 29        int (*pminus)(int, int) = minus;
 30        int (*ptimes)(int, int) = times;
 31        //调用func()函数,分别传入不同的函数指针,回调不同的函数
 32         result = func(pplus, 1, 10);                //回调plus()函数
 33         printf("1+2+3+...+10  = %d\n", result);
 34         result = func(pminus, 10, 10);                //回调minus()函数
 35         printf("-10-9-8-...-1 = %d\n", result);
 36         result = func(ptimes, 2, 6);                //回调times()函数
 37         printf("0+2+4+...+10  = %d\n", result);
 38        return 0;
 39     }

例1运行结果如图1所示。

图1 例1运行结果

在例1中,第2~13行代码分别定义了plus()、minus()、times()函数,实现两个整数的加减乘运算;第15~23行代码定义了一个func()函数,该函数接受一个函数指针和两个整型数据作为参数,在函数内部,通过for循环获取数据,将获取的数据传递给函数指针p作为参数,实现相应运算,这个过程就是回调p指向的函数。在main()函数中,第28~30行代码分别定义了指向plus()函数、minus()函数、times()函数的指针;第32~33行代码,调用func()函数,传入pplus函数指针,在func()内部回调plus()函数实现1~10之间的自然数相加;第34~35行代码,调用func()函数,传入pminus函数指针,在func()函数内部回调minus()函数实现(-10)~(-1)之间的整数相加;第36~37行代码,调用func()函数,传入ptimes函数指针,在函数内部回调times()函数,实现0~10之间的偶数相加。

由图1可知,三次func()函数调用均成功,这表明func()函数内部的回调函数也调用成功。

点击此处
隐藏目录