C89:论回调函数
一.简介
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数
而那个函数需要利用传递的地址来调用回调函数
例如我们在调用某个API函数的时候,可以把回调函数的地方传递给API,API函数会在某个特定条件下调用回调函数
假如我们要写一个函数供别人使用,但是并不知道数据类型,可以为每种类型写一个重载函数实现多态,但这是C++专有的.而回调函数需要让调用者自己准备数据类型,这样我们写的函数就可以调用别人写的函数知道数据类型
回调函数是由别人的函数执行时调用你实现的函数
消息机制也是一种回调函数,假如进程B收到进程A发送的消息,调用了一个函数,又向进程A发送消息,这个函数就是回调函数
机制:
(1)定义一个回调函数
(2)提供函数实现,并将回调函数的函数指针注册给调用者
(3)当特定的事件或条件发生时,调用者使用函数指针调用回调函数对事件进行处理
二.函数指针
回调在C语言中是通过指针来实现的,通过将回调函数的指针传给被调函数,从而实现回调
1 2 3 4 5 6 7 | // b.cpp // 回调函数,被其他函数调用 void fCallback( char * s) { ... } |
1 2 3 4 5 6 7 8 9 10 | // 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*)
);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | // 快速搜索函数 #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)二分搜索函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void * bsearch ( const void * key, const void * base, size_t nelem, size_t width, int (_USERENTRY* fcmp)( const void *, const void *) ); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)