写了几年的程序,但从来没用过回调函数,一直以为比较难,因为看的资料是这样的:
如果参数是一个函数指针,调用者可以传递一个函数的地址给实现者,让实现者去调用它,这称为回调函数(Callback
Function)。
不知道是不是本人理解力有问题,总感觉这个定义太绕。所以,一直也没理明白。
上面这句话可以这样来理解:如果有这样一个函数A,它的参数是一个函数指针,调用(此函数A)的人可以传递一个函数B(另一个)的地址给这个函数A,让调用A函数的人来实现函数B,这样的A函数称为回调函数。
可能这样说还是不能让人明白,不如先上代码好了。
#include <stdio.h> typedef void (*callback_t)(void *); void id(void *id) { printf("Your ID is %d!\n", *(int *)id); } void bye(void *str) { printf("Bye, %s!\n", (char *)str); } void print(callback_t f, void *para) { f(para); } int main(int argc, char *argv[]) { int *id_num, i = 123; argc = argc; argv = argv; id_num = &i; print(id, id_num); print(bye, "Small fish"); return 0; }
首先定义一个函数指针类型,方便后续定义。再定义两个函数,这两个函数的参数、返回值都是一样的,都是void、void *型。对于void print(callback_t f, void *para)
函数来说,它是不知道传入的f()要做什么,也不知道它要什么样的参数,它只起到一个调用的作用,而具体执行的东西由实际传入的f()决定。例如print(id, id_num);
,它传入的是:
void id(void *id) { printf("Your ID is %d!\n", *(int *)id); }
。对于编写id函数的人来说,它当然知道id()函数要做什么,它就是为了输出“Your ID is xxx”。同时,id()函数的参数也应该是整型的id值。因此,它需要把void *类型转为int *。而bye()函数同理。
在这里,print()函数就是一个回调函数,它仅提供了一种函数的调用形式。因此,从这个观点看,回调函数其实是在更高层次对一般函数进行封装。