[牛人杂谈] C语言 — 函数的注册和回调

[复制链接]
1402|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 | 显示全部楼层
  1. /*A Module*/
  2. /*TestA.c 文件
  3. 实现回调函数*/
  4. #include "test.h"

  5. void callback_fun(int event)
  6. {
  7.         switch(event)
  8.         {
  9.                 case 1:
  10.                         {
  11.                                 printf("ABCDEFG.\n");
  12.                                
  13.                         }
  14.                         break;
  15.                 case 2:
  16.                         {
  17.                                 printf("abcdefg.\n");
  18.                         }
  19.                         break;
  20.                 case 3:
  21.                         {
  22.                                 printf("1234567.\n");
  23.                         }
  24.                         break;
  25.                 case 4:
  26.                         {
  27.                                 printf("7654321.\n");
  28.                         }
  29.                         break;
  30.                 default:
  31.                         {
  32.                                 printf("New event, %d.\n",event);
  33.                         }
  34.         }
  35. }

  36. void main()
  37. {
  38.         int event = 0;
  39.         Compute_ST ptr_compute;
  40.        
  41.         ptr_compute.index = 1;
  42.         ptr_compute.function = callback_fun;
  43.         //注册回调函数
  44.         if(-1 == Registe_Callback_Fun(&ptr_compute))
  45.         {
  46.                 printf("Registe failed.\n");
  47.         }
  48.        
  49.         for(;;)
  50.         {
  51.                 printf("Enter number:");
  52.                 scanf("%d", &event);
  53.                
  54.                 if(event == 0)
  55.                 {
  56.                         return;
  57.                 }
  58.                 //触发事件
  59.                 mgmtb_fun(event);
  60.         }
  61.         return;
  62. }
 楼主| 643757107 发表于 2023-11-20 21:57 | 显示全部楼层
  1. /*B Module
  2. testB.c文件
  3. 实现注册函数
  4. 实现事件触发回调*/
  5. #include "test.h"

  6. pf_callbakck g_ptrfun;

  7. int Registe_Callback_Fun(Compute_ST *registed_fun)
  8. {
  9.         if(1 != registed_fun->index)
  10.         {
  11.                 printf("Registe failed.\n");
  12.                 return -1;
  13.         }
  14.         g_ptrfun = registed_fun->function;
  15. }

  16. void mgmtb_fun(int event)
  17. {
  18.         g_ptrfun(event);
  19. }
 楼主| 643757107 发表于 2023-11-20 21:58 | 显示全部楼层
编译并运行:
Enter number:3
1234567.
Enter number:2
abcdefg.
Enter number:1
ABCDEFG.
chenqianqian 发表于 2023-11-21 08:50 来自手机 | 显示全部楼层
C语言函数的注册和调用主要是操作指针。
jf101 发表于 2023-11-22 15:04 | 显示全部楼层
非常简单的“观察者模式”
Henryko 发表于 2023-11-22 16:50 | 显示全部楼层
有没有老哥给讲一下观察者模式
Henryko 发表于 2023-11-22 17:45 | 显示全部楼层
回调就是前人调用后人写的代码
Jacquetry 发表于 2023-11-25 09:17 来自手机 | 显示全部楼层
回调函数可以让用户自定义程序内容
zhuomuniao110 发表于 2023-11-25 19:12 | 显示全部楼层
是不是注册函数的意思就是将回调函数的指针传递给主调执行函数?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3972

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部