zoukankan      html  css  js  c++  java
  • 回调函数

    回调函数

     

    在看LWIP时,见到用回调函数,再看某老外公司OPC源码时,见到用回调函数。看我国内某些代码(我公司软件等)时没用到。于是,我对回调函数产生了非常大的好奇。曾经,我写VC程序时用到过回调函数,可是没实用C语言来使用。近期,看到国外大量的经典代码中广泛使用了回调函数(LWIP、某两个公司的OPC程序等),都是C语言来实现的,而不是VC windows程序中别人实现自己使用的那种。

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

    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

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

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

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

     

     

    第二个问题:

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

    我实现了一个非常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

  • 相关阅读:
    AX ERROR: Could not find my mock parent, most likely I am stale 不及格的程序员
    利用Segue在视图控制器间传值的问题 不及格的程序员
    Creating a Singleton Instance 不及格的程序员
    iPad 通知 UIKeyboardWillShowNotification 不会在keyBoard处在Undock状态下接到通知 不及格的程序员
    Why RootViewController's view is rotated Automatically by System when the app first loaded? 不及格的程序员
    如何弹出UIDatePicker最好 不及格的程序员
    jQuery开始做恶了 不及格的程序员
    what is the SEL,id and IMP,Class ,Method? 不及格的程序员
    Objectivec 字符串比较的陷井 不及格的程序员
    Unable to create any keyboard shortcuts after the iOS 6.1.3 update on iPad. 不及格的程序员
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3833291.html
Copyright © 2011-2022 走看看