打印
[牛人杂谈]

C语言 — 函数的注册和回调

[复制链接]
891|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
643757107|  楼主 | 2023-11-20 21:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
函数注册和回调函数
1、什么是函数注册和回调
回调函数无非是对函数指针的应用,说白了就是通过使用函数指针来调用一个函数,而函数注册就是把函数指针作为参数传递出去便于别的模块使用的过程。所以函数注册就是为了回调,先注册再回调。

2、为什么要使用回调函数
回调函数可以把调用者与被调用者分开,所以调用者不关心谁是被调用者以及被调用者如何实现。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。

3、回调函数常见应用场景
不同模块由不同开发人员实现,为了实现模块间信息交互触发行为。(似乎很难理解,下面看模型吧)

3、函数注册和回调的模型

模块A用来实现出现各种事件后的函数处理,程序B 用来监控发生的事件。A模块向B模块注册函数,B模块监控到事件后回调事件的函数处理。

使用特权

评论回复
沙发
643757107|  楼主 | 2023-11-20 21:56 | 只看该作者

使用特权

评论回复
板凳
643757107|  楼主 | 2023-11-20 21:57 | 只看该作者
/*A Module*/
/*TestA.c 文件
实现回调函数*/
#include "test.h"

void callback_fun(int event)
{
        switch(event)
        {
                case 1:
                        {
                                printf("ABCDEFG.\n");
                               
                        }
                        break;
                case 2:
                        {
                                printf("abcdefg.\n");
                        }
                        break;
                case 3:
                        {
                                printf("1234567.\n");
                        }
                        break;
                case 4:
                        {
                                printf("7654321.\n");
                        }
                        break;
                default:
                        {
                                printf("New event, %d.\n",event);
                        }
        }
}

void main()
{
        int event = 0;
        Compute_ST ptr_compute;
       
        ptr_compute.index = 1;
        ptr_compute.function = callback_fun;
        //注册回调函数
        if(-1 == Registe_Callback_Fun(&ptr_compute))
        {
                printf("Registe failed.\n");
        }
       
        for(;;)
        {
                printf("Enter number:");
                scanf("%d", &event);
               
                if(event == 0)
                {
                        return;
                }
                //触发事件
                mgmtb_fun(event);
        }
        return;
}

使用特权

评论回复
地板
643757107|  楼主 | 2023-11-20 21:57 | 只看该作者
/*B Module
testB.c文件
实现注册函数
实现事件触发回调*/
#include "test.h"

pf_callbakck g_ptrfun;

int Registe_Callback_Fun(Compute_ST *registed_fun)
{
        if(1 != registed_fun->index)
        {
                printf("Registe failed.\n");
                return -1;
        }
        g_ptrfun = registed_fun->function;
}

void mgmtb_fun(int event)
{
        g_ptrfun(event);
}

使用特权

评论回复
5
643757107|  楼主 | 2023-11-20 21:58 | 只看该作者
编译并运行:
Enter number:3
1234567.
Enter number:2
abcdefg.
Enter number:1
ABCDEFG.

使用特权

评论回复
6
chenqianqian| | 2023-11-21 08:50 | 只看该作者
C语言函数的注册和调用主要是操作指针。

使用特权

评论回复
7
jf101| | 2023-11-22 15:04 | 只看该作者
非常简单的“观察者模式”

使用特权

评论回复
8
Henryko| | 2023-11-22 16:50 | 只看该作者
有没有老哥给讲一下观察者模式

使用特权

评论回复
9
Henryko| | 2023-11-22 17:45 | 只看该作者
回调就是前人调用后人写的代码

使用特权

评论回复
10
Jacquetry| | 2023-11-25 09:17 | 只看该作者
回调函数可以让用户自定义程序内容

使用特权

评论回复
11
zhuomuniao110| | 2023-11-25 19:12 | 只看该作者
是不是注册函数的意思就是将回调函数的指针传递给主调执行函数?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

3805

帖子

11

粉丝