打回来

回调函数

在看LWIP时,见到用回调函数,再看某老外公司OPC源码时,见到用回调函数。看我国内某些代码(我公司软件等)时没用到。于是,我对回调函数产生了非常大的好奇。曾经,我写VC程序时用到过回调函数。可是没实用C语言来使用。

近期,看到国外大量的经典代码中广泛使用了回调函数(LWIP、某两个公司的OPC程序等)。都是C语言来实现的,而不是VC windows程序中别人实现自己使用的那种。

为了弄明确这样的函数的奥妙。首先提出三个问题:

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

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

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

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

打开baidu.com、google.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

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

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

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

第二个问题:

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

我实现了一个非常easy的回调函数。

#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层就是一个接口。

这是我的理解。Over!

时间: 2024-10-22 00:37:13

打回来的相关文章

一次请假回来之后的系统一系列奇葩问题的解决记录

休假几天回来,电脑就有各种问题,先是插上iphone,直接没反应连充电都不行,手机关机就可以充电,将同一条线移到别的电脑上正常.各种折腾,把所有apple有关的软件卸载干净再重装后,正常了. 然后就是开机提示有文件损坏要用CHKDSK修复,一些软件也有莫名其妙的错误提示,重建用户配置文件无效,那就chkdsk吧,好么,重启CHKDSK直接提示错误,跳过直接进系统了.如下说什么"Cannot open valume for direct access"云云, 总之除了系统盘,其他盘都可以

WPF: ShowDialog() 切换到其他应用窗口后,再切换回来无法让子窗口总在最上方

按说ShowDialog()是模态窗口,应该在主窗口的上方,但是打开其他应用窗口再切换回来的时候,发现子窗口不见了,主窗口又不能操作. 另外子窗口设置成不在任务栏显示,只能通过Alt-Tab来切换到子窗口. 我找了很久,才找到一个解决办法,其实很简单, 就是在子窗口里设置Owner为父窗口. 我是在子窗口的构造函数里写的: this.Owner = Application.Current.MainWindow; 参考链接如下: http://www.telerik.com/community/f

uitableView 选择跳转后 再跳回来 颜色不变 问题

今天遇见过这个问题  以前都没这方面需求所以没有遇见 今天遇见了 网上查了 没有查到 好吧 只能说自己的问题 但是 还好kai哥到 一句话就解决了 ! 就是在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath中反选回来 如下代码: - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(

我有回来了

<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv=&qu

Google,你快回来!(附各种姿势)

发表于 上网,请科学一点2014-06-08 13:30 字数: 1469 阅读量: 1316 由于受到5月35日的影响,自5月27日开始,国内访问Google由间歇性抽风逐步转化为完全瘫痪,Google在国内遭遇最严厉的封锁.当然,这已经不是第一次了,从最早Google.cn退出中国,转入香港Google.com.hk,再接着开始关键词过滤,google在国内的份额就已经大大减少了. 关键词过滤是什么?一些不乖的孩子在Google搜了不应该搜的敏感词,接下来的数分钟内Google打不开的现象.

从大西北回来后的感悟

不知不觉从大西北回到天津已经一个多星期了,大西北的项目可能需要我,我也知道父母亲人更希望我离家里近一些,也担心我留在大西北,以后和他们见面难:我申请了回来,我明知道回到内地公司根本没有什么项目,再加上公司制度刚刚改革,而我确像一只无助的鸟,再努力的支撑自己,我知道这次会有两个结果,一个是跌下深渊自己离开,一个是展翅飞翔: 回到老家过年,跟父母跟家人交流,我知道一个女生的年龄如果过大,会给家人带来很大的困扰,更何况我们的农村,姑姑以为我想留在外边,说我不理解父亲的难处.其实,他们不知道我都是把他们

C++ Day 3rd(出去吃饭了回来晚了)

今天依然是个令人懵的一天,听了两遍关于编程中的循环问题,还是似懂非懂. 打开题库做题,看着挺简单一个题,可编起来咋就这么难呢? 1028,在两位善良至极学长的帮助下,可算是写出来了.看看自己做过的题,不知不觉,1031了,还是有点成就感的. 不过跟其他人比,还是有差距的.也不知道那些个刷到1050的dalao们是怎么做到的. 回来路上还跟亲爱的老爹吵了起来(有伤风雅,勿学): 这些东西有的大学生还不懂了更何况你们,好好学吧,别放弃自己. 哦. 临近放学,明天要考试的通知传来,我的心里是崩溃的.这

单例模式不是一件小事,快回来看看

上次写了一篇<单例模式那件小事,看了你不会后悔>的文章,总结了常用的单例模式的实现.本文是上文的延续,单例模式绝不是一件小事,想弄清楚,真不是那么简单的.上文提到了常用的三种单例模式的实现方法:饿汉式(除了提前占用资源,没毛病.),懒汉式(DCL优化过后,没毛病?),静态内部类式(优雅的方法,没毛病.).文末最后还提到,反射会破坏单例. 本文继续,双重检查锁定优化过后的懒汉式,真的没毛病吗?其实不是,这里涉及到java编译器编译时的一些细节,对象初始化时的写操作与写入 sSingleton 字

CABasicAnimation 按home键后台之后,再切回来动画就停止

RemovedOnCompletion 这个属性默觉得 YES,那意味着,在指定的时间段完毕后,动画就自己主动的从层上移除了.这个一般不用. 假如你想要再次用这个动画时,你须要设定这个属性为 NO.这种话,下次你在通过-set 方法设定动画的属 性时,它将再次使用你的动画,而非默认的动画. 假设CABasicAnimation 按home键后台之后,再切回来动画就停止,仅仅要将RemovedOnCompletion属性设为no

从厚田作死回来一周年记

文字任性,标点任性,排版任性,思维任性. 那是去年的五一,在清明节的时候有一次骑行去江边的事,后来我在想,五一的时候是不是也可以出去浪一把,于是我想跑得远一点,然后我就选了厚田,号称江南第一沙漠,距离我们学校30多公里,当时我就想,上次去江边大概是9公里的样子,也就三倍多,上次悠闲得还是隔壁的所谓江西科技大学晃一圈(确实有点破),于是想到,也不过此30公里.于是出发前我跟mran说我去厚田,回来跟你讲.好吧,于是就这样出发了,后来才知道,那是一个怎么填也填不满的坑. 上午室友打乒乓到11点,然后