如果函数的参数是一个函数指针,我们可以通过这个函数指针传递一个函数的地址给另外一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数(Callback Function)。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
因为可以把调用者与被调用者(实现者)分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。换句话讲,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
下面是一个回调函数的示例:
void func( void (*f)(void *), void *p );
其调用者与实现者之间的协议如下:
调用者 |
实现者 |
1、提供一个回调函数,再提供一个准备传给回调函数的参数。 2、把回调函数传给参数f,把准备传给回调函数的参数按void *类型传给参数p |
1、在适当的时候根据调用者传来的函数指针f调用回调函数,将调用者传来的参数p转交给回调函数,即调用f(p); |
下面是一个简单的例子。实现了一个repeat_three_times函数,可以把调用者传来的任何回调函数连续执行三次。