首先,明确下概念,回调(call back)是一个过程,回调函数(call back funciton)是这个过程中的一个函数;
再明确一点,回调函数和普通函数没有任何差别,是的,没有任何差别,你想怎么写就怎么写,只要能满足需求。
回调的本质:把指向回调函数的指针作为参数传给其他函数,其他函数通过这个指针就能使用回调函数。
回调过程涉及3个部分,调用者、使用回调函数的函数、回调函数。
简单的例子如下:
#include<stdio.h>
//回调函数1
int cbfunc1(int a, int b)
{
return a - b;
}
//回调函数2
int cbfunc2(int a, int b)
{
return a*2 - b;
}
//使用回调函数的函数
int func(int (*cb)(int, int))
{
int op1 = 10;
int op2 = 25;
int ret = cb(10, 25);
return ret;
}
//调用者
int main()
{
int ret1, ret2;
ret1 = func(cbfunc1);
ret2 = func(cbfunc2);
printf("ret1 = %d\n", ret1);
printf("ret2 = %d\n", ret2);
return 0;
}
输出结果:
ret1 = -15
ret2 = -5
int func(int (*cb)(int, int))
的参数是一个函数指针
回调过程:main函数调用func函数,把cbfunc作为指针参数传给func, func运行时会通过这个指针去调用指向的函数。
说白了就是,main调用func,func调用cbfunc(单线程的情况下),特殊的地方就是func通过指针调用cbfunc。
用途:
调用不在同一区域的函数,比如动态库想调用外边的函数,就可以写一个回调;用void指针可以让回调更灵活。