什么是回调函数?一直都比较模糊,似懂非懂,今天就来总结一下!
- 首先从一个链表查找函数开始,程序如下:
Node * search_list( Node *node, const int *value ) { while( node != NULL ) { if( node->value == value ) break; node = node->link; } return node; }
这个函数看上去很简单,但它只适用于节点值为整形的链表,如果需要在一个字符串链表中查找,你不得不另外编写一个函数,其中绝大部分代码相同,只是第二个参数的类型以及节点值的比较方法不同。
-
实际上,我们可以编写一个比较函数,然后把该函数的指针作为参数传递给查找函数,查找函数通过调用这个传入的函数对节点值进行比较。使用这种方法,可以比较任何类型的值。使用这种技巧的函数叫做回调函数(callback function),因为用户把一个函数指针作为参数传递给其他函数,后者将“回调”用户的函数。
- 任何时候,如果你所编写的函数必须能够在不同的时刻执行不同类型的工作或者执行只能由函数调用者定义的工作,你都可以使用这个技巧。许多窗口系统使用回调函数来连接多个动作,如鼠标拖拽。
- 回调版本的链表查找函数定义如下:
Node * search_list( Node *node, const int *value, int (*compare)(const void *, const void *) ) { while( node != NULL ) { if( compare(&node->value, value) == 0 ) break; node = node->link; } return node; } int compare( const void *a, const void *b ) { return *(int *)a == *(int *)b; }
其实stdlib库中的排序函数qsort()就是典型的回调函数,其函数原型为:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))