个人对回调函数的理解(personal understanding of callback function)

之前觉得回调函数很神奇,而且我自己也没怎么用过,就更添了一些神秘感。有一天突然特别想了解一下,结果找遍了网上的各大网站和博客,没有发现一个比较好的解释。要么直接上代码,没有一点讲解;要么讲解的云里雾里,上的例子都是windows里面的现成的回调函数。但是,经过我个人的琢磨,发现其实这玩意没啥太深奥的,在此记录一下自己的对回调函数的理解,也希望对入门回调函数的人有用。

1.回调函数的定义

百度百科给的定义:回调函数就是一个通过函数指针调用的函数。

维基百科给的定义:回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。

虽然百度百科一般来说没有维基百科准,但是关于回调函数的定义还是百度百科给的比较直白,维基的那个定义对于入门者来说太抽象太拗口。

我的理解是,回调函数和其他声明的函数没有任何本质区别,只是调用的时候有区别。或者说,随便一个函数,比如叫:int fun(int para),如果你用fun(10)这种方法调用,它就是普通函数,如果你用指针方法调用),那么它就是回调函数。可见,回调函数和普通函数的区别不是本体,仅仅是调用的方法不同。

2.回调函数的具体用法

假设我们有两个函数A和B,我们想把A作为回调函数,在B中用函数指针来调用它,那么怎么做呢?其实很简单:

首先,A的定义和声明还是照常写,例如,返回两个输入变量的乘积:

int A(int x,int y)
{
    return x*y;
}

然后,B的定义和声明就有点讲究了,因为要用函数指针调用A,所以B的形参中需要一个函数指针指向A,具体来讲就是这么写:

void B(int(*ptr)(int x,int y),int para)
{
    int result=(*ptr)(5,10)*para;
    printf("%d\n",result);
}

看起来好像很奇怪,其实也没什么,就是第一个参数是个函数指针而已,而函数指针的写法,也没什么复杂,原来的方法是:

int A(int x,int y)
只要把A替换成一个指针形势就行,例如:(*p),(*ptr)这种,其他的保持不变即可。在此稍微提一下函数指针,具体写法是:
int(*p)(int x,int y)=&A;

p就是指向函数A的指针。

最后,在main函数里面调用B即可测试我们的写的对不对:

int main()
{
    B(&A,8);
    system("pause");
    return 0;
}

3.回调函数的作用

说到回调函数的作用,我刚开始也不太明白,后来咨询了lp大人然后自己又领悟了一会,算是大致明白了。总的来说,回调函数可以将不同层次的开发分开,适用于二次开发。比如:底层开发者已经写完整体框架,其中有一些函数是开放给顶层开发者使用的,那么可以用此种方式。另外,这也防止顶层开发者看到或改动源代码(如果底层开发者不希望源码开发或者不希望框架被改动)。因为顶层开发者只需要写好B函数,然后将B函数传入A(即调用A函数)即可。具体来说,就是底层开发者写好了B函数,然后顶层开发者可以自己写A和main函数,但是只能调用B函数,关键的其实并不是回调函数本身,而是调用回调函数的那个B怎么实现。如果我们还是按照常规的函数调用方法的话,A,B和main是不能分开的,因为如果A被修改了,那么B中每一处调用A的地方都需要修改,可是B的代码是不开放的,这就很难做到了。但是,如果把A作为一个参数传给B,那么修改的时候只需要修改B的形参即可。

以上就是我对回调函数的一些理解。

 

 

posted @ 2012-12-05 13:39  handspeaker  阅读(694)  评论(0编辑  收藏  举报