Callback回调函数介绍(C语言)

这篇具有很好参考价值的文章主要介绍了Callback回调函数介绍(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 回调函数的定义

2. 为什么要用回调函数

3. 怎么用回调函数

3.1 怎么使用没有参数的回调函数

3.2 怎么使用带参数的回调函数


1. 回调函数的定义

最近在工作中经常用到回调函数callback,总结一下。

先来看看维基百科对callback的解释:In computer programming, a callback is any executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at a given time. This execution may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback.也就是说,把一段可执行的代码像参数传递一样传递给其他代码,而这段代码会在某个时刻被调用执行,这就叫回调。如果代码被立即执行就被称为同步回调,如果在之后晚点的某个时间再执行,则被称之为异步回调。

再来看看来自Stack Overflow某位大神的表述:A “callback” is any function that is called by another function which takes the first function as a parameter. 也就是说,函数F1调用函数F2的时候,函数F1调用函数F2时,F1通过参数给F2传递了另一个函数F3的指针,在F2执行的过程中会调用函数F3,这个动作就是回调(callback),而被作为指针传入、后面又被回调的函数F3就是回调函数。

最后再看看百度百科的解释:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

2. 为什么要用回调函数

为什么不能像普通函数那样在回调的地方直接写上函数的名字呢?为什么非得用回调函数呢?其实在某些时候回调函数可以使用普通函数来实现,但是回调函数还是有其存在的作用的。其中回调函数最大的好处就是解耦,因此普通函数不能完全替代回调函数。

Callback回调函数介绍(C语言)

#include<stdio.h>
#include<softwareLib.h>
int Callback()           //Callback Function
{
    //TODO
    return 0;
}

int main()
{
    //TODO
    Library(Callback);
    //TODO
    return 0;
}

仔细一看,在回调函数中,主程序把回调函数像参数一样传入库函数。这样一来,只要改变传进库函数的参数,就可以实现不同功能,并且丝毫不需要修改库函数的实现,这就是解耦。

另外,主函数和回调函数是在同一层的,而库函数在另外一层。库函数被封装在库中,不能修改库函数的实现,也就是说不能通过修改库函数让库函数调用普通函数那样实现,那我们就只能通过传入不同的回调函数了。

其实很多地方可以使用普通函数来替代回调函数,但是如果需要降低耦合度的时候,更应该使用回调函数。

3. 怎么用回调函数

3.1 怎么使用没有参数的回调函数

首先来看没有参数的回调函数,下面是一个简单的可以执行的同步回调函数代码。

#include<stdio.h>
int Callback_1()
{
    printf("Hello, this is Callback_1 \n");
    return 0;
}

int Callback_2()
{
    printf("Hello, this is Callback_2 \n");
    return 0;
}

int Callback_3()
{
    printf("Hello, this is Callback_3 \n");
    return 0;
}

int Handle(int (*Callback)())
{
    printf("Entering Handle Function.\n");
    Callback();
    printf("Leaving Handle Function. \n");
}

int main()
{
    printf("Entering Main Funtion. \n");
    Handle(Callback_1);
    Handle(Callback_2);
    Handle(Callback_3);
    printf("Leaving Main Function.\n");
    return 0;
}

运行结果是:

Entering Main Function.
Entering Handle Function.
Hello, this is Callback_1
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_2
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_3
Leaving Handle Function.
Leaving Main Function.

可以看到,Hanle()函数里面的参数是一个指针,在main()函数里调用Handle()函数时,给它传入了Callback_1()/Callback_2()/Callback_3()的函数指针,也就是说,回调函数其实是函数指针的一种用法。再后头看一遍:“A “callback” is any function that is called by another function which takes the first function as a parameter.” 是不是更明白一些呢?

3.2 怎么使用带参数的回调函数

上一节我们知道了回调函数怎么使用,如果回调函数需要输入参数呢?当然可以使用带参数的回调函数。只需要简单修改一下上面的例子:

 #include<stdio.h>

    int Callback_1(int x) // Callback Function 1
{
        printf("Hello, this is Callback_1: x = %d \n", x);
        return 0;
    }

    int Callback_2(int x) // Callback Function 2
{
        printf("Hello, this is Callback_2: x = %d \n", x);
        return 0;
    }

    int Callback_3(int x) // Callback Function 3
{
        printf("Hello, this is Callback_3: x = %d \n", x);
        return 0;
    }

    int Handle(int y, int (*Callback)(int))
{
        printf("Entering Handle Function. \n");
        Callback(y);
        printf("Leaving Handle Function. \n");
    }

    int main()
{
        int a = 2;
        int b = 4;
        int c = 6;
        printf("Entering Main Function. \n");
        Handle(a, Callback_1);
        Handle(b, Callback_2);
        Handle(c, Callback_3);
        printf("Leaving Main Function. \n");
        return 0;
    }

运行结果是:

Entering Main Function. 
Entering Handle Function. 
Hello, this is Callback_1: x = 2
Leaving Handle Function.
Entering Handle Function. 
Hello, this is Callback_2: x = 4
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_3: x = 6
Leaving Handle Function.
Leaving Main Function.

可以看到,只需要回调函数增加一个参数,如int Callback_1(int x) ,再在调用时增加一个参数(int Handle(int y, int (*Callback)(int))),传递给回调函数就行了,同理,也可以使用多个参数的回调函数。文章来源地址https://www.toymoban.com/news/detail-432417.html

到了这里,关于Callback回调函数介绍(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Junit + Mockito 测试回调(callback) 方法

    语言:Java JDK: Java8 及以上。 Java8推出函数式接口后,就经常使用此特性开发。 在使用Junit + Mockito 时遇到有回调(callback)的函数方法时,遇到几种情况,这里进行记录。 对于Mockito中打桩个人理解:测试的方法在正常环境需要引入其他类中的方法来 支撑(实) ,但是在

    2024年01月17日
    浏览(44)
  • 响应式编程Reactor优化Callback回调地狱

    Reactor 是一个基于Reactive Streams规范的响应式编程框架。它提供了一组用于构建异步、事件驱动、响应式应用程序的工具和库。Reactor 的核心是 Flux (表示一个包含零到多个元素的异步序列)和 Mono 表示一个包含零或一个元素的异步序列)。 Reactor 通过提供响应式的操作符,如

    2024年02月02日
    浏览(52)
  • Android JNI传递CallBack接口并接收回调

    在JNI中,可以通过传递一个Java接口对象的引用给C++代码,并在C++代码中调用该接口对象的方法,实现JAVA层监听C++数据变化,下面是一个简单的示例: 在Java代码中定义一个CallBack接口和JNI方法 使用JNI实现将Java接口对象传递给C++代码,并在C++代码中调用接口方法。 在C++代码中

    2024年02月12日
    浏览(40)
  • 什么是异步编程?什么是回调地狱(callback hell)以及如何避免它?

    前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一

    2024年02月10日
    浏览(41)
  • c语言函数指针和指针函数的区别,以及回调函数的使用。

    函数指针 是什么,函数指针本质也是指针,不过是指向函数的指针,存储的是函数的地址。 指针函数 是什么,指针函数其实就是返回值是指针的函数,本质是函数。 函数指针是如何定义的呢,如下 这里 * pfun 需要 加括号 ,否则定义为了指针函数。 指针函数的定义如下: 下面

    2024年02月11日
    浏览(45)
  • 【再识C进阶2(中)】详细介绍指针的进阶——函数指针数组、回调函数、qsort函数

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖        在这一篇博客中,我们要认识并理解 函数指

    2024年02月09日
    浏览(45)
  • 【C语言】回调函数(qsort)与模拟实现

    何思何虑,居心当如止水;勿取勿忘,为学当如流水。— 出自《格言联璧·学问类》 解释:无思无虑,心境应当平静如水;不求冒进也不忘记,学业当如流水一般永无止境。 这篇博客我们将会理解回调函数这个概念,以及借用qsort帮助理解,并且最终用qsort的思路来实现冒泡

    2024年02月16日
    浏览(45)
  • c语言中回调函数的理解和使用

    返回总目录 回调函数是通过函数指针实现的。可以将调用者和被调用者进行解耦,通过一个函数指针可以关联不同的函数实现,实现前提是函数指针和函数实现的参数类型一致,用户通过把需要调用函数的指针作为参数传递给一个函数进行实现,可以实现个功能模块之间的解

    2024年02月15日
    浏览(30)
  • 【C语言】——指针五:转移表与回调函数

    1.1、转移表的定义      在之前的学习中,我们学习了 函数指针数组 (详情请看【C语言】——指针四:字符指针与函数指针变量),在最后。我曾问到:函数指针数组有什么用呢?别急,本文给大家细细道来。      函数指针数组常常被用在 转移表 中,那转移表是

    2024年03月26日
    浏览(43)
  • 【C语言】深入解析C语言中的回调函数及其应用

    目录 什么是回调函数? 回调函数有什么作用? 额外的进阶用法? 1. 传递多个参数: 2. 回调函数和数据封装: 3. 函数指针的灵活性: 回调函数的概念可能有些抽象,让我们尝试用一个简单的生活场景来解释它。假设你有一项重要任务需要完成,但任务的一部分要依赖于其他

    2024年02月12日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包