http://dev.csdn.net/author/firefox1/c57fc75d3dbc46fcb6e3f5ffd0850930.html
一直以来我都认为回调函数就是传一个函数指针给一个函数,在那个特定的函数里面用这个回调函数处理,返回想要的结果给调用的那个函数。像上面那个链接里面的CListCtrl的例子。typedef void(CALLBACK* SORTLISTPROC)(LPARAM dwCtl);   //处理插入排序的回调函数,class CSortableListCtrl : public CListCtrl
{
 DECLARE_DYNAMIC(CSortableListCtrl)public:
 CSortableListCtrl();
 virtual ~CSortableListCtrl();protected:
 DECLARE_MESSAGE_MAP()public:
 //在插入数据到列表后立即排序,如果用此方法,在插入数据时必须将该数据插入到第一行
 void SortAfterInsert(SORTLISTPROC lpSort, LPARAM dwCtrl);   //这里调用回调函数};很多人说回函数是系统调用,不知我理解正确不,我觉得,WindowProc这样的函数是系统调用,你可以修改来响应不同的消息。但上面的例子,我觉得是要自己添加处理的方法的,如在一个响应CListCtrl 的InsertItem或SetItemText消息才在消息响应函数里面调用SortAfterInsert,才有机会调用到那个回调函数,这就是所谓的系统自动调用。 但在这样的情况下,我是可以将这个回调函数的实现写在SortAfterInsert这个类里面的,从面不用上面那个回调函数也可以的。不过对于类型不同的比较,传入不同的指针,在不同的回调函数里面做不同的数据类型转换等,有时候还是很方便的。  不知我上面的理解正不正确??? 欢迎大家指正和发表一下意见。 谢谢

解决方案 »

  1.   

    回调可以理解为就是传递一个函数指针fp作为函数fn的参数,这样在fn的函数处理中,当希望返回一些数据时,就可以调用fp,而fp有调用者自己实现,调用者就可以在fp中得到fn返回的数据,以便进一步处理...
      

  2.   

    ListCtrl::Sort 中就会传递你的回调函数,这样在ListCtrl中就会根据你这个比较函数来决定到底按什么条件排序
      

  3.   

    通过函数地址等形式将你的实现与某个特定函数邦定到一起。这个特定函数可以是系统定义的,也可以是developer定义的。这也常用在一些如observer之类的设计模式中。
      

  4.   

    那么说是我理解的对了,为什么其他地方都讲得那么复杂,好像所有的回调都是系统调用的。如果只是写一个callback,没有传指针去使用又不是消息响应的,根本没有可能被调用。
      

  5.   

    callback也是一个函数,只不过给它的定义是由别的函数来调用,用法和普通函数没什么区别,这个函数也可以随便使用,只要你知道添写参数的内容,在MFC中自己调用WindowProc也能实现想要的结果
      

  6.   

    回调函数,就是把函数指针传过去,让其他函数来调用,具体实现,你再处理这个回调函数就行。。
    下面是我在写串口通信时用的回调函数://自定义函数指针,当有数据接收时执行
    //data: 指向接收数据的缓冲
    //length: 实际接收到数据的长度
    typedef void (*PFN)(char* data, int length); 
    /*
    功能:用于与串口通信*/
    class CyxComm
    {
    private:
    PFN m_pCallBackFn; //回调函数指针,当接收到数据通知此函数
    }//线程函数
    UINT threadRecvData(LPVOID pParam)
    {
    CyxComm* yxComm = (CyxComm*)pParam;
    //串口打开?
    while (yxComm->isOpenPort())
    {
    //从串口读数据
    int len = sio_read(yxComm->getPort(), yxComm->getRecvBuffer(), MAX_RECV_BUFFER);
    //如果有数据
    if ( len > 0)
    {
    //有回回调函数来进行分析接收到的数据
    if (yxComm->getFn())
    {
    char* p = yxComm->getRecvBuffer();
    //p: 指向接收数据的缓冲的指针
    //len: 实际接收到数据的大小
    //把这两个变量通知回调函数
    yxComm->getFn()(p, len);
    }
    }
    Sleep(100);
    }
    return 0;
    }回调函数也不一定要让系统来调用的,根据你的需要,具体实现就行了
      

  7.   

    其实对于回调函数有两种调用方法。举例来讲一般qsort应该是同步调用,你调用它的时候传入回调函数指针,这个函数内部使用你给的函数来完成。
    这些应该都是发生在你自己的程序内的。而windows的窗口过程winproc则有所区别,它是一种异步调用。
    你注册上一个回调函数,至于什么时候来调用这个回调函数则由系统来控制的。这种常称为系统调用。
      

  8.   

    callback就是将函数的地址放在一个变量里,然后再call。直接调用则是call函数的地址,也就是常量。
      

  9.   

    来了这么久CSDN,第一次受推荐,哈哈不知有没有分加呢。
      

  10.   

    回调函数就是把函数名称作为一个参数传递给另一个函数,这样这个函数在使用这个参数时就相当于在调用这个函数。所有的实现都是基于这个原理,包括STL的泛型算法,win32的窗口过程函数,MFC的消息处理函数。内部实现都是要把函数首地址作为参数传给另一个函数,让这个函数在使用参数的同时,不需要关系回调函数的实现细节。
      

  11.   


    #include<stdio.h>
    typedef struct ode
    {
      int value;
      struct Node *link;
    }Node;/*Call back function, it's useful for different kind of node, we just want to change compare function*/Node* getnode(Node *ele,void const *val, int (*compare)(void const*, void const *))
    {
      while(ele!=NULL)
      {
        if(compare(&(ele->value),val))
            break;
        ele=ele->link;
      }
      return ele;
    }
    int com_int(void const *a,void const *b)
    {
      if(*(int *)a==*(int *)b)
          return 0;
      else
          return 1;
    }
    int main()
    {
      Node root;
      Node one;
      int target=90;
      one.value=90;
      one.link=NULL;
      root.value=35;
      root.link=&one;
      Node* tmp=getnode(&root,&target,com_int);
      if(tmp!=NULL)
      {
        printf("%d",tmp->value);
      }
      return 0;
    }//其实回调函数不一定就一定要什么callback之类的才是,很平常的函数也可以是回调函数。  如上面的例子,
    //是一个纯C的例子,com_int就是一个回调函数。这里并没有什么系统注册,系统自动调用的。
    //这样当然我也可以不用回调函数而实现相关的功能,只要自己实现一个getnode函数,指定具体的类型就行了。 
    //但是对于不同的类型,你要实现不同的getnode函数;如果用回调的方式,你只要实现不同的回调就行了。
    //上面的例子是  C与指针  里面抄下来的。
    //但我并不否认像windows里面的LRESULT CALLBACK WindowProc是回调函数,而且是系统自动调用的,只是想让概念更清楚一点。
    //不知我上面的想法是不是正确的???
      

  12.   


    就像这个:LRESULT CALLBACK WindowProc(          HWND hwnd,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
    );
    //系统定义好了格式之类的,也有做好了关联的,而且是一个virtual函数,你可以改写。
    //但在最后调用其基类的WindowProc就行了。即这样:
    //return __super::WindowProc(message, wParam, lParam);
      

  13.   

    很模糊的概念,不知是不是我模糊了系统调用一般是 系统接口 API 等,
    这里不知是不是 由系统执行 的意思因为:可以当成一个专有名词“系统调用
          或者是一个主谓句子 “系统 调用
    我语法水平低,别笑回调函数:将函数的地址作为参数传递给其他函数
    (一般用于和第三方交互)
    这样就有相对性了
    我可以定义 一回调函数 传入某 API 或自定义函数,这是通常情况也可以将某 API 函数的地址作为参数 传到我定义的函数
    这时这个 API 也叫 回调函数?
    一般:
    1.回调函数是自定义的,格式根据需要而定2.回调函数是系统调用
    (1)回调函数是 API ?
       设计操作系统的人真闲阿
    (2)回调函数 由系统执行?
       那系统有的忙了
    哪线程注册这个回调函数,就由它来执行WindowProc 等这些回调函数在系统是不存在的
    是要程序员定义的,只不过是一些占位符另外 WindowProc 是由 创建界面的那条线程 来执行的,
    而不是什么系统调用,系统自动调用
    一般这些 窗体回调函数 ,系统负责消息通知,界面线程执行说不完...
      

  14.   

    在C语言中,用到函数指针即可看成一种callback,使用函数指针是构成编程框架的重要元素。
      

  15.   

    callback就是个概念,意思就是:你把要调用的东西传给对方,对方在某个时候会调用它。
    实现都可以,可以是一个c函数指针,一个c++的functor等等。
      

  16.   

    回调函数是系统调用?!第一次听说,这是两个不相干的概念吧!系统调用是指调用操作系统提供的运行在系统空间的服务,至少Linux是这样,也许Windows比较另类。而回调函数只是一种语言特性而已。
      

  17.   

    学习,但是我觉得这和用postmessage应该是一样的啊