一.简介
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数
而那个函数需要利用传递的地址来调用回调函数
例如我们在调用某个API函数的时候,可以把回调函数的地方传递给API,API函数会在某个特定条件下调用回调函数
假如我们要写一个函数供别人使用,但是并不知道数据类型,可以为每种类型写一个重载函数实现多态,但这是C++专有的.而回调函数需要让调用者自己准备数据类型,这样我们写的函数就可以调用别人写的函数知道数据类型
回调函数是由别人的函数执行时调用你实现的函数
消息机制也是一种回调函数,假如进程B收到进程A发送的消息,调用了一个函数,又向进程A发送消息,这个函数就是回调函数
机制:
(1)定义一个回调函数
(2)提供函数实现,并将回调函数的函数指针注册给调用者
(3)当特定的事件或条件发生时,调用者使用函数指针调用回调函数对事件进行处理
二.函数指针
回调在C语言中是通过指针来实现的,通过将回调函数的指针传给被调函数,从而实现回调
// b.cpp // 回调函数,被其他函数调用 void fCallback(char* s) { ... }
// a.cpp typedef void(*pcb)(char*); void GetCallBack(pcb callback) { ... } GetCallBack(fCallback);
三.示例
C语言的标准库中很多地方采用了回调函数来让用户自定义处理过程,如常用的快速排序函数 二分搜索函数等
- (1)快速排序函数
void qsort
(
void* base,
size_t nelem,
size_t width,
int (_USERENTRY* fcmp)(const void*, const void*)
);
// 快速搜索函数 #include <stdio.h> #include <stdlib.h> int sort_function(const void* a,const void* b); int list[5] = {54, 21, 11, 67, 22}; int main() { int x; qsort((void*)list, 5, sizeof(list[0]), sort_function); for(x = 0; x < 5; x++) printf("%d ", list[x]); system("pause"); return 0; } int sort_function(const void* a, const void* b) { return *(int*)a-*(int*)b; }
- (2)二分搜索函数
void* bsearch ( const void* key, const void* base, size_t nelem, size_t width, int (_USERENTRY* fcmp)(const void*, const void*) );