Chinaunix首页 | 论坛 | 博客
  • 博客访问: 100832
  • 博文数量: 52
  • 博客积分: 2095
  • 博客等级: 大尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-08 13:29
文章分类

全部博文(52)

文章存档

2010年(1)

2009年(24)

2008年(27)

我的朋友

分类: C/C++

2008-05-14 19:45:44

看了看书和资料,七拼八凑,回调还是很难理解。

*和(),()的优先级高于*.比如int *p(),p先和()结合表示函数,这就表示一个返回值为指向int的指针的函数.加上括号int (*p)(),先和*结合表示一个指针,后面的()表示没有参数的函数 .另外,[]和()优先级是相同的,表示数组.int (* p[3])()表示 一个3元素数组,每个元素都是一个指向返回值为int的无参函数的指针.

c primer plus上面的函数与指针一章,讲了比较简单的方法.把一个函数的声明中的函数名用(*pf)形式来替换,就能得到这种函数的指针.用来调用函数的时候可以用这种形式(*pf)(parameter1,..).该书也讲了用函数指针作为某函数的参数,这属于高级用法.这也是回调函数的用法.

关于回调函数复制了一段:函数之类本是为调用者准备的美餐,其烹制者应对食客了如指掌,但实情并非如此。例如,写一个快速排序函数供他人调用,其中必包含比较大小。麻烦来了:此时并不知要比较的是何类数据--整数、浮点数、字符串?于是只好为每类数据制作一个不同的排序函数。更通行的办法是在函数参数中列一个回调函数地址,并通知调用者:君需自己准备一个比较函数,其中包含两个指针类参数,函数要比较此二指针所指数据之大小,并由函数返回值说明比较结果。排序函数借此调用者提供的函数来比较大小,借指针传递参数,可以全然不管所比较的数据类型。被调用者回头调用调用者的函数(够咬嘴的),故称其为回调(callback)。

回调函数主要用于一些比较费时的操作,或响应不知道何时将会发生的事件,回调函数提供了一种异步的机制,相对于同步执行,提高了效率.前者的例子如WriteFileEx,ReadFileEx等,函数的最后一个参数是一个回调函数的指针,程序中调用WriteFileEx以后,就直接返回了,可以继续进行其他工作,系统在读写操作完成后通知程序作善后处理.后者的例子就是windows的事件机制回调函数的另一个用途,是用于一些枚举函数,如EnumDisplayModes等,每找到一种支持的显示模式,就通知回调函数,由回调函数具体处理,这是因为 EnumDisplayModes本身并不知道用户要如何处理.能,用户提供回调函数,定制系统的功能,这样,不同的用户提供不同的回调函数,可以使系统具有不同的功能.这就是所谓的plugin.使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数,跟具体使用的API函数有关,一般在帮助中有说明回调函数的参数和返回值等。

阅读(1067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~