LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1259|回复: 14

关于回调机制

[复制链接]
发表于 2006-3-17 11:13:49 | 显示全部楼层 |阅读模式

  1. RError FOODemo::InsertCallbackStatic(void* arg)
  2. {   
  3.                ...
  4.        
  5.         if (notifier == NULL)
  6.                 return RError_OK;
  7.         return notifier->InsertChanged();
  8. }
复制代码

一直没弄清楚如何理解。
谢谢先。
发表于 2006-3-17 22:17:56 | 显示全部楼层
没头没脑。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-19 12:01:58 | 显示全部楼层
多谢!
为什么一定要用回调呢?干吗不直接用函数调用呢?非要用函数的指针去调用函数。回调函数相当在硬件中一个中断处理程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-19 12:09:46 | 显示全部楼层
多谢!
为什么一定要用回调呢?干吗不直接用函数调用呢?非要用函数的指针去调用函数。回调函数相当在硬件中一个中断处理程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-19 12:15:51 | 显示全部楼层
骂得好啊!真的还是要谢谢俄X11,大好人啊!
回复 支持 反对

使用道具 举报

发表于 2006-3-19 22:33:26 | 显示全部楼层
举个例子,你可能会写一个通用的排序程序,比方说快速排序。
sort(void *l, (int)(compare*)(void *a, void *b))

然后你调用的时候,你可以让他来对整数数组进行排序,只要定义
int_compare(void* a, void *b)
或者任意的自定义的结构体数组的排序,只要提供比较函数
customed_compare(void *a, void *b)
这样进行这些排序,你都不需要重写这个排序算法。这是直接调用无法实现的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-20 09:47:51 | 显示全部楼层
能解释的再通俗易懂点好吗? 举个例说吧:

  1. void DealResult_Down(char*, int)
  2. {
  3.         ...
  4. }
  5. void DealResult_Up(char*, int)
  6. {
  7.         ...
  8. }
  9. void DealResult_Right(char*, int)
  10. {
  11.         ...
  12. }
  13. void DealResult_Left(char*, int)
  14. {
  15.         ...
  16. }
  17. void SearchResult_Enter(char* ,int )
  18. {
  19.         ...
  20. }
  21. void DealResultBG()
  22. {
  23.         ...
  24.      Dealler.Up = DealResualt_Up;
  25.      Dealler.Down = DealResualt_Down;
  26.      Dealler.Left = DealResualt_Left;
  27.      Dealler.Right = DealResualt_Right;
  28.      Dealler.Enter = DealResualt_Enter;
  29. }
复制代码

如果有类似这样的代码,这里是将各个不同处理函数的地址赋值给Dealler这个结构体的成员(他们是函数指针类型)。那么Dealler.xxx是不是在别处被当作参数进入其他函数的体内去调用这些函数呢?
无意中看到的。

  1. typedef void(*MyFunctionPointer)(char*, int)
  2. ...
  3. void  Demo(){
  4. ...
  5.           case 0:
  6.                   Dealler.Up("Millor", 100);
  7.           case 1:
  8.                    Dealler.Down("OKli", 200);
  9.            
  10.        ...
  11. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-3-20 14:41:07 | 显示全部楼层
指向函数(回调函数)的指针,是个好东西,很多时候写程序用这个很方便。
就是指针的声明很晦涩,反正我是不能理解那个语法。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-30 12:10:03 | 显示全部楼层
真的不知道为什么回调函数的机制比直接调用普通函数有何优势?
回复 支持 反对

使用道具 举报

发表于 2006-3-30 12:51:08 | 显示全部楼层
Post by sybaselu
真的不知道为什么回调函数的机制比直接调用普通函数有何优势?

那你先想想,使用变量比使用立即数有什么优势?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表