美文网首页
C 语言学习(7) ---- 回调函数

C 语言学习(7) ---- 回调函数

作者: 特立独行的佩奇 | 来源:发表于2023-03-24 17:17 被阅读0次

回调函数的定义

根据维基百科的定义:把一段可以执行的代码像参数一样传递给其他代码,这段可执行的代码会在某个时间点被调用执行,这个就叫回调;如果代码立刻执行就称为同步回调,如果代码在之后的某个时间点被执行,称为异步回调

C语言中函数的本质就是一段可执行的代码,如果使用函数指针,将本模块的函数传递到另外一个模块,由另外一个模块的代码执行,这个函数就是回调函数

回调函数的作用

回调函数的调用的原理本质上和普通的函数调用是一致的,可以理解在回调函数执行的地方,如果直接使用回调函数的函数名做调用,效果是一致的;本质是一个更加灵活的函数调用
回调函数的主要作用是解耦合

callback原理.jpg

主程序将回调函数作为参数传递给库函数,只要改变传递给库函数的参数,就可以实现不同的功能,并且完全不需要改变库函数的功能,这个就是解耦合的含义
库函数和主程序一般不属于一层或者一个模块,库函数是按照通用性设计的,不知道主程序会用什么样的函数处理;也就是说不能通过修改库函数调用普通函数的方式实现,那我们就只能通过参数传入不同的回调函数了

回调函数的基本结构

同步回调一种形式:使用函数指针将回调函数传入B模块,B模块没有保存函数指针的内容,在函数体内立刻调用

//module_A
uint32_t Callback(uint32_t a) {
    .......
}

maindatdaflow(uint32_t a,  Callback);

//module_B
typedef uint32_t (*stdfunction)(uint32_t p); 

maindatdaflow(uint32_t a,  stdfunction f) {
    
    
  uint32_t temp = xxx;
  ....
  f(temp)

}

异步回调的一种形式,区别在于会将回调函数保存,之后在合适的地方调用它

//module_A
uint32_t Callback(uint32_t a) {
    .......
}

register_callback(Callback);





//module_B
typedef uint32_t (*stdfunction)(uint32_t p); 

stdfunction callBack;

register_callback(stdfunction f) {
    callBack = f;
}


run () {
.... 
run(callBack)

}

回调函数使用过程中,回调函数是在主程序中定义,所以可以使用主程序的全局变量和相关函数,在通用库主体中被调用,所以通用库只能通过回调函数实参和主程序共享数据

回调函数的参数讨论

实际的Callback 函数都会带一个万能指针类型的参数,原型如下:
uint32_t Callback(uint32_t a, void* userData) {
.......
}

void* userData 就是库函数传给主程序的数据内容指针,这部分内存的分配可以是从主程序中分配:即在注册Callback 的时候传给给它,此时register_callback 要改成下面的形式
register_callback(stdfunction f,void* p)
库函数本质只是做一个透传

也可以直接在 库函数中分配,传递给它

相关文章

  • C语言回调函数

    文章来源本人的博客:http://codelifeliwan.github.io/ 转载请注明出处 本代码和语言参...

  • C语言回调函数学习

    转载自 https://blog.csdn.net/farsight2009/article/details/47...

  • [C]基础语法

    [C语言]数据结构 STRUCT 结构体 位域 ERUM 枚举语法定义格式 回调函数 C语言中的回到函数 Defi...

  • C语言编程学习回调函数详解

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程...

  • 30/70 C语言回调函数

    layout: "post"title: "30/70 C语言回调函数"date: "2017-03-29 21:...

  • 2020-04-25 编程语言 经他么 整词儿

    静态语言:c/c++ 回调或虚函数? 迭代:tm什么意思? 生成器:tm什么意思?

  • UI(二十)block

    *block代码块 闭包(一个区域)与C语言函数类似 *block具有反向传值、回调的功能 回调:执行完毕之后返回...

  • iOS - block

    *block代码块闭包(一个区域)与C语言函数类似 *block具有反向传值、回调的功能 回调:执行完毕之后返回再...

  • c++11 之回调函数

    什么是回调函数,以及在c++中如何使用? 回调函数就是将函数 作为参数传给其他的函数。 c++ 中有三种方式实现:...

  • block基础-1

    block块是在ios4开始,就出现了。block实质就是C语言的回调函数。block函数定义如下 void (^...

网友评论

      本文标题:C 语言学习(7) ---- 回调函数

      本文链接:https://www.haomeiwen.com/subject/kexgrdtx.html