回调函数 callback 的实现原理是什么? - 知乎 (zhihu.com)
最近的项目中涉及到很多c的代码,里面有一些信号槽机制,signal、listener、emit等。但是其实底层都是回调函数callback。
举个例子
// 定义函数指针
int (* g_pFun) (int x, int y);
// 定义两个函数
int Max(int x ,int y){
}
int Min(int x, int y){
}
int main(int argc, char* argv[]){
int r;
int a = 10;
int b = 15;
g_pFun = Max;
r = g_pFun(a, b); // 相当于执行Max
g_pFun = Min;
r = g_pFun(a, b); // 相当于执行Min
return 0;
}
大家可以看到,同样是执行g_pFun,却执行的不同的函数。这就是函数指针的妙用。
这里Max,Min函数就是钩子函数,把函数指针g_pFun指向函数Max,Min的过程,就是"挂钩子"的过程,相当于把钩子函数“挂到”函数指针上。非常形象。
在我们的代码中,常常把挂钩子的过程叫做注册,会提供一个注册函数,让使用者把自己编写的钩子函数挂在已经声明的函数指针上,这个注册函数的参数就是我们的函数指针了,比如,我们可以给刚才的函数指针提供一个注册函数
// 注册
int RegFun(int (*pFun)(int x, int y)){
g_pFun = pFun;
return 0;
}
总结:定义一个函数指针->注册(挂钩子)->调用。
注册这里可以换不同的函数。