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*)
 
);

 

posted @   言午丶  阅读(172)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示