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