2 / 9
2010 年
年年
年 5 月
月月
月 21 日
日日
日
在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接
口的类成为回调类,回调类的对象成为回调对象。对于象 C++或 Object Pascal 这
些兼容了过程特性的对象语言,不仅提供了回调对象、回调方法等特性,也能兼
容过程语言的回调函数机制。
Windows 平台的消息机制也可以看作是回调的一种应用,我们通过系统提供的接
口注册消息处理函数(即回调函数),从而实现接收、处理消息的目的。由于
Windows 平台的 API 是用 C 语言来构建的,我们可以认为它也是回调函数的一个
特例。
对于分布式组件代理体系 CORBA,异步处理有多种方式,如回调、事件服务、通
知服务等。事件服务和通知服务是 CORBA 用来处理异步消息的标准服务,他们
主要负责消息的处理、派发、维护等工作。对一些简单的异步处理过程,我们可
以通过回调机制来实现。
下面我们集中比较具有代表性的语言(C、Object Pascal)和架构(CORBA)来分
析回调的实现方式、具体作用等。
2 过程语言中的回调
过程语言中的回调过程语言中的回调
过程语言中的回调(
((
(C)
))
)
2.1 函数指针
函数指针函数指针
函数指针
回调在 C 语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数
从而实现回调。因此,要实现回调,必须首先定义函数指针,请看下面的例子:
void Func(char *s);// 函数原型
void (*pFunc) (char *);//函数指针
可以看出,函数的定义和函数指针的定义非常类似。
一般的化,为了简化函数指针类型的变量定义,提高程序的可读性,我们需要把
函数指针类型自定义一下。
typedef void(*pcb)(char *);
回调函数可以象普通函数一样被程序调用,但是只有它被当作参数传递给被调函
数时才能称作回调函数。
被调函数的例子: