一、什么是回调

  软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

二、C语言中的回调

  回调在C语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调。因此,要实现回调,必须首先定义函数指针:

  void func(char *s); //函数原型
  void (*pfunc)(char *); //函数指针

  一般为了简化函数指针类型的变量定义,提高程序的可读性,我们需要把函数指针类型自定义一下。

  typedef void(*pcb)(char *);

  回调函数可以像普通函数一样被程序调用,但是只有它被当作函数参数给被调函数时才能称作回调函数。

  例:   

void GetCallBack(pcb callback)
{
  /*do something*/
}
用户在调用上面的函数时,需要自己实现一个pcb类型的回调函数:
void fCallback(char *s)
{
  /* do something */
}
然后,就可以直接把fCallback当作一个变量传递给GetCallBack,
GetCallBack(fCallback);

  

02-12 18:50