什么是回调函数?

2023-05-16

为了弄明白这种函数的奥妙,首先提出三个问题:

1.        回调函数是什么东西?

2.        回调函数怎么开发,怎么使用?

3.        回调函数的作用,应该在什么情况下使用?

 

带着问题来学习,有目的!呵呵,个人经验。

打开baidu.comgoogle.cn搜索了好多资料,如下:

顺便提一下,某君的一个签名很让我佩服:1好好活着,因为我们会死很久。2五千年的文明 两百年的无奈

 

第一个问题:

*******************************************************************************

其实回调就是一种利用函数指针进行函数调用的过程.  

为什么要用回调呢?比如我要写一个子模块给你用,   来接收远程socket发来的命令.当我接收到命令后,   需要调用你的主模块的函数,   来进行相应的处理.但是我不知道你要用哪个函数来处理这个命令,     我也不知道你的主模块是什么.cpp或者.h,   或者说,   我根本不用关心你在主模块里怎么处理它,   也不应该关心用什么函数处理它......   怎么办?

使用回调!

—— lone wolf

 

使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。

—— 某专家

 

回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。

—— 绿叶

 

http://hi.baidu.com/zhuyipeng/blog/item/863fefdb7c736c63d1164eec.html 是一篇比较好的文章。

 

什么是回调函数?
  回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
  理解回调函数!

—— jufengfeng

 

Function Pointers provide the concept of callback functions.

—— newty.de

*******************************************************************************

看了这么多的资料,我只将每位的定义总结一下就一句话:回调函数就是函数指针的一种用法。

在部分资料上,大量讨论了回调函数怎么被调用,到底被谁调用,还有好多的图形,我认为都没有看到问题的本质。

 

 

第二个问题:

*********************************************************************

我实现了一个很简单的回调函数。

#include <stdio.h>

 

void printWelcome(int len)

{

       printf("欢迎欢迎 -- %d/n", len);

}

 

void printGoodbye(int len)

{

       printf("送客送客 -- %d/n", len);

}

 

void callback(int times, void (* print)(int))

{

       int i;

       for (i = 0; i < times; ++i)

       {

              print(i);

       }

       printf("/n我不知道你是迎客还是送客!/n/n");

}

void main(void)

{

       callback(10, printWelcome);

       callback(10, printGoodbye);

       printWelcome(5);

}

*******************************************************************************

上面的代码没有被任何系统函数调用,说明那些东西只是撒撒土迷迷路人眼而已。还有面相对象编程时,用class给封装起来也是掩人耳目,不要被外表所迷惑。

 

 

第三个问题:

*********************************************************************

用过STL的人都知道,在STL中众多算法和程序都用到回调函数,这实现了一种策略。只要任何符合我的标准的函数和计算都可以用我这个公式。你可以实现各种各样的回调函数,只要符合我的格式就能用。

就上面的程序来说,你只要函数格式符合cllback第二个参数的格式不论你给别人做饭、铺床叠被都可以正常工作。这就是回调的作用,把回调实现留给别人。

这是一个用法。

 

有一位朋友用分层的概念来解释了回调机制:callback函数为B层,main函数和print*函数为A层,A层调用了B层的回调函数callmeback,而B层的回调函数调用了A层的实现函数print*。说白了B层就是一个接口。

 

 

我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他
们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想用智慧开创属于自己的事业。我想说的是,其
实我是一个程序员

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是回调函数? 的相关文章

  • c语言之文件学习

    文件是相关信息的集合 文字信息 声音信息 图形信息 文件的取名 xff1a 主文件名 扩展名 文件的分类 xff1a xff08 c 程序中 xff09 A xff1a 文本文件 B xff1a 二进制文件 xff08 data xff09
  • 翻转c风格的字符串

    这里的字符串是c风格的字符串 以 39 0 39 结尾 include lt stdio h gt using namespace std void reverse string 01 char void reverse string 02
  • 交换两个字符串

    swap char p1 char p2 char p p 61 p1 p1 61 p2 p2 61 p void main char str1 61 34 12345 34 char str2 61 34 ABCDEFG 34 char
  • 翻转句子中单词的顺序

    include 34 stdafx h 34 include 34 iostream 34 include lt windows h gt include lt stdlib h gt include lt stdio h gt using
  • 常用的vi/vim命令

    转载自 xff1a https blog csdn net wang907553141 article details 78846784 常用的vi vim命令 xff1a vi命令 xff1a yy xff1a 复制 光标所在的这一行 n
  • sql中limit使用方法

    sql中limit使用方法 此处以mysql为例 xff0c 但是我相信物以变通在oracle上也一定适用 1 下面是几种limit的方法 xff1a 原则看看下面几个例子应该就懂了 在数据库中很多地方都会用到 xff0c 比如当你数据库查
  • 数据库sql的优化问题的面试题

    想一下这个道面试题怎么做 有一张user表有1000万条数据 xff0c 请为下面的sql提供优化建议 xff1f 字段分别为 xff1a 主键id xff0c 用户id xff0c 姓名 xff0c 性别 select from user
  • 日期加一天的函数

    bool isLeapYear int year if year 4 61 61 0 amp amp year 100 61 0 year 400 61 61 0 判断闰年 return true return false void add
  • SpringAOP简单案例

    简介 本文是一个老师在学校给学生上课的简单案例 xff0c 介绍了AOP的五个通知的使用 xff0c 以及通知的执行顺序 通过自定义注解来充当切入点 xff0c 获取注解的类型分别对不同的老师做对应的业务处理 代码中的消息响应体 xff08
  • 学习 shell脚本之前的基础知识

    转载自http www 92csz com study linux 12 htm 日常的linux系统管理工作中必不可少的就是shell脚本 xff0c 如果不会写shell脚本 xff0c 那么你就不算一个合格的管理员 目前很多单位在招聘
  • Linux入门教程

    http www 92csz com study linux 发现这个写的不错 xff0c 作为小白入门非常棒 xff01
  • c与c++的区别

    相同 xff1a C 43 43 是在C语言的基础上改进的 xff0c C语言的很多语法在 C 43 43 中依然广泛使用 xff0c 例如 xff1a C 43 43 仍然使用 char short int long float doub
  • 多线程--线程管理

    说到多线程编程 xff0c 那么就不得不提并行和并发 xff0c 多线程是实现并发 xff08 并行 xff09 的一种手段 并行是指两个或多个独立的操作同时进行 注意这里是同时进行 xff0c 区别于并发 xff0c 在一个时间段内执行多
  • 选择排序和冒泡排序

    void select sort int a int n 选择排序 选择排序 xff0c 每次选择最小的放在第一个位置 xff0c 然后下次从第二个位置开始 for i 61 0 i lt n 1 43 43 i j 61 i 给下标放在一
  • 数据库面试题

    1 数据库系统的核心是 A 数据模型B 数据库管理系统C 软件工具D 数据库 2 下列叙述中正确的是 A 数据库是一个独立的系统 xff0c 不需要操作系统的支持 B 数据库设计是指设计数据库管理系统 C 数据库技术的根本目标是要解决数据共
  • 什么是shell?

    操作系统与外部最主要的接口就叫做shell shell是操作系统最外面的一层 shell管理你与操作系统之间的交互 等待你输入 xff0c 向操作系统解释你的输入 xff0c 并且处理各种各样的操作系统的输出结果 shell提供了你与操作系
  • 《心流》——每天十分钟,解读完本书

    心流 每天十分钟 xff0c 解读完本书 你好 xff01 这里是 每天十分钟 xff0c 解读完本书 xff0c 我是财哥哥 xff0c 今天为你解读的是 心流 xff0c 作者是米哈里 契克森米哈赖 他是积极心理体验这一领域的权威学者
  • SourceInsight4.0的使用

    转自 xff1a https blog csdn net qq 39660930 article details 77499455 一 项目管理 1 新建一个项目 快捷键Alt 43 Shift 43 N可以打开新建项目对话框 xff0c

随机推荐

  • 输入一个英文句子,翻转句子中的单词,要求单词内的字符顺序不变。 如:I am a student. 转换成 student. a am I

    输入一个英文句子 xff0c 翻转句子中的单词 xff0c 要求单词内的字符顺序不变 如 xff1a I am a student 转换成 student a am I 算法分析 xff1a 1 通过ReverseString xff08
  • OpenMLDB开源社区贡献者体系今日发布

    关于OpenMLDB OpenMLDB 是一个开源机器学习数据库 xff0c 提供企业级 FeatureOps 全栈解决方案 OpenMLDB 致力于闭环解决 AI 工程化落地的数据治理难题 xff0c 并且已经在上百个企业级人工智能场景中
  • 排序算法

    影响排序算法性能的几个要素 xff1a 1 时间性能 2 辅助空间 3 算法的复杂性 直接插入排序算法的基本操作是将一个记录插入到已经排好序的有序表中 xff0c 从而得到一个新的 xff0c 记录数增加一的有序表 void InsertS
  • c语言常用小知识点总结1

    define 用来定义宏常量 格式 xff1a define 标识符 大写字母 常量 define PI 3 14 注意后面是不加 分号的 常用字母的ASCII码 39 a 39 61 97 39 A 39 61 65 39 0 39 61
  • 数据结构学习笔记1

    程序设计 61 数据结构 43 算法 谈谈算法 数据结构与算法是 好基友 xff0c 如果单独谈数据结构 xff0c 或者单独谈算法是没什么意义的 来一个牛叉的算法吧 xff01 计算1 43 2 43 3 43 4 43 100 xff0
  • Oracle面试题附带答案

    1 你要对操纵Oracle数据库中的数据 下列哪个选项表示Oracle中select语句的功能 xff0c 并且不需要使用子查询 xff08 C xff09 A xff0e 可以用select语句改变Oracle中的数据 B xff0e 可
  • C结构体中数据的内存对齐问题

    转自 xff1a http www cnblogs com qwcbeyond archive 2012 05 08 2490897 html 32位机一般默认4字节对齐 xff08 32位机机器字长4字节 xff09 xff0c 64位机
  • 解决codeblocks无法调试的问题

    错误提示 xff1a ERROR You need to specify a debugger program in the debuggers 39 s settings For MinGW compilers it 39 s 39 gd
  • 求出现在字符串1而没有出现在字符串2中的字符

    编写一个函数 xff0c 它的功能是将未在字符串s中出现 xff0c 而在字符串t中出现的字符 xff0c 型参一个新的字符串放在u中 xff0c u中的字符按原字符的顺序排列 xff0c 但要去掉重复字符 至少会想到去考察t xff0c
  • 什么情况下需要建立索引? 索引的作用?为什么能够提高查询速度?(索引的原理) 索引有什么副作用吗?

    https www cnblogs com Berryxiong p 6249427 html 为什么能够提高查询速度 xff1f 索引就是通过事先排好序 xff0c 从而在查找时可以应用二分查找等高效率的算法 一般的顺序查找 xff0c
  • 100w测试数据,为什么加了索引查询反而变慢了?

    建表 xff1a create table tb test fval varchar 50 插入测试数据 xff1a DELIMITER CREATE DEFINER 61 96 root 96 64 96 localhost 96 PRO
  • linux环境下使用gdb调试c和c++ 学习笔记

    第二十三课 xff1a GDB简介 哔哩哔哩 bilibili gdb调试 xff1a 1 gcc a c b c c c o app g g 编译器会保留函数名和变量名 2 启动gdb gdb 可执行程序的名字 xff08 gdb app
  • ubuntu下eth0网卡信息不见了

    ubuntu终端下命令ifconfig的问题解决 问题一 ifconfig之后只显示lo 没有看到eth0 问题二 ifconfig之后显示eth0 xff0c 但是没有显示静态IP地址 xff0c 即无inet 地址 广播 掩码 问题三
  • 计算机指令

    指令系统的设计原则包括 xff1a 完备性 xff1a 该有的都要有 有效性 xff1a 简洁 加速常用操作 没有歧义 规整性 xff1a 对称 均匀 一致 xff08 简单源于规整 xff09 兼容性 xff1a 之前 之后的都能用 下面
  • shell基础学习笔记1

    shell是什么 xff1f shell是一个命令解释器 xff0c 他为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序 xff0c 用户可以用shell来启动 挂起 停止甚至编写一些程序 其实就是输入命令的那个交互界面
  • linux达人养成学习笔记1

    2 4 分区之分区设备文件名与挂载 1 swap分区 xff0c 没有挂载点 xff0c 是文件系统类型 xff08 交换分区 xff0c 电脑内存 lt 4G xff0c 可分为内存2倍 xff1b gt 4G分同等大小 xff09 2
  • shell编程之变量学习小结

    在Bash中 xff0c 变量的默认类型都是字符串型 变量的分类 1 用户自定义变量 xff1a 变量可以自定义 xff0c 但是对系统生效的环境变量名和变量作用是固定的 2 环境变量 xff1a 这种变量中主要保存的是和系统操作环境相关的
  • 程序员的自我修养

    1 Provide Options Don 39 t make lame Excuses 提供各种选择 xff0c 不要找蹩脚的借口 2 Don 39 t live with Broken Windows 不要容忍破窗户 3 Be a ca
  • 二阶三阶四阶魔方旋转公式

  • 什么是回调函数?

    为了弄明白这种函数的奥妙 xff0c 首先提出三个问题 xff1a 1 回调函数是什么东西 xff1f 2 回调函数怎么开发 xff0c 怎么使用 xff1f 3 回调函数的作用 xff0c 应该在什么情况下使用 xff1f 带着问题来学习