CallBack是什么意思?

Gil 2001-03-18 05:58:00
有时看到一个函数返回值是CALLBACK, 有时看到说某某函数是callback函数
call back是什么意思?
举例说一下?
...全文
2491 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gil 2001-03-21
  • 打赏
  • 举报
回复
谢谢大家,加分了,50分好像不够?/:)
mengqiyuan 2001-03-21
  • 打赏
  • 举报
回复
windows下的回调函数没怎么看过,linux里面经常会用到回调函数,不过从原理上和楼上的各位大侠们说的差不多,它是个函数指针,在发生某种事件的时候来调用,一个常用的例子就是在使用单进程处理多个连接请求时,通常使用异步i/o处理,网络连接通常采用非阻塞方式,这样在接受到事件时就会根据不同连接的不同事件去调用它的回调函数处理。
farland 2001-03-21
  • 打赏
  • 举报
回复
CALLBACK规定了函数调用的一种格式,如参数的调用顺序是从右到左,传递方式为传值等,
与一般的C函数调用有所区别。
kuhx 2001-03-21
  • 打赏
  • 举报
回复
留下
Kevin_qing 2001-03-21
  • 打赏
  • 举报
回复
:P

*^o^*
rockswang 2001-03-21
  • 打赏
  • 举报
回复
为kevin鼓掌!!
可以看一看我的WannaPlayDIB实用图形库的源代码,里面的像素过滤我采用了回调函数来实现。
http://wannaplay.51.net
rocks_lee@263.net
Kevin_qing 2001-03-20
  • 打赏
  • 举报
回复
并不是只有winapi 使用的才叫callback 哦。

我们也可以在自己的模块里面给外部提供callback.

比如记log,发消息等等。

例如一个下载模块,需要发进度给用户程序。

下面是该模块的API
typedef void (CALLBACK* pfProgress)(int percent);
int Down(LPCSTR URL,LPCSTR localFile,pfProgress progress=NULL)
{
...
while(nSize<RealSize)
{
nRecv=recv()....
nSize+=nRecv;
if(progress)
{
progress(nSize*100/RealSize);
}

}
}


CALLBACK 宏的主要作用是防止因为函数参数个数传递的不正确,造成程序错误。

因为CALLBACK函数的栈是由调用方来清除,而标准C函数是在函数返回时清出。

所以对CALLBACK函数传多余/少于它的参数并不会造成栈的问题。

但是其效率比标准C函数低一点。(因为会做附加的清除栈,而不是由ret n返回)
APIer 2001-03-20
  • 打赏
  • 举报
回复
#define CALLBACK __stdcall
这是CALLBACK的定义,其实他只不过是用windows的标准call,不用类的却省__thiscall,他是不能够晚绑定的,如果使用在类里面,必须是static修饰,一般的在很多API中间有一个函数指针是回调函数地址,这个函数是交给用户实现,然后由原来的那个API调用的,所以叫做回调函数,这是我的理解,不知道对不对。下面是我猜测的API如何调用回调函数的,个人观点,请高手指正:
typedef void (__stdcall* FunCallBack)(int nTest);

void __stdcall APIXXXX(const FunCallBack UserFun)
{
FunCallBack Fun=UserFun;
int i=0;
do
{
UserFun();
i++;
}while(Fun);
}
Kevin_qing 2001-03-20
  • 打赏
  • 举报
回复
To Gil :
是的,只要是函数的声名形式一样就可以。
所以可以通过传不同的 pCALLBACKFun 来回调不同的函数。
CandyCat 2001-03-20
  • 打赏
  • 举报
回复
对了,你下载了VC知识库5吗?在 通用控件入门 的 PWIN98/95下演练CList 中有“(6)排序功能的实现”,你看看上面的例子噢.
其他的好处我也不知道了。
继续听课。。。
CandyCat 2001-03-20
  • 打赏
  • 举报
回复
对了,你下载了VC知识库5吗?在 通用控件入门 的 PWIN98/95下演练CList 中有“(6)排序功能的实现”,你看看上面的例子噢
Gil 2001-03-20
  • 打赏
  • 举报
回复
谢谢Kevie_qing, 谢谢CandyCat, 谢谢APIer, 谢谢大家

是不是这样的:
利用typedef void (CALLBACK* pCALLBACKFun)();声明以后,
就可以把任何返回值为void的CALLBACK函数地址赋给pCALLBACKFun
然后就能用pCALLBACKFun调用那些以定义和实现的CALLBACK类型函数.
不知道理解的对不对,
如果是的话,那么这样作除了能够使pCALLBACKFun能灵活的调用很多函数以外,还有什么好处呢?

谢谢大家



damadama 2001-03-19
  • 打赏
  • 举报
回复
关注
lukejin 2001-03-19
  • 打赏
  • 举报
回复
callback函数就是由系统调用的函数,而不属于任何物件,比如标准的API
xd_g 2001-03-19
  • 打赏
  • 举报
回复
callback就是用户按照系统规定编写的方法,在满足条件的时候由系统来调用

举例:枚举字体、枚举窗口等标准API
xzgyb 2001-03-19
  • 打赏
  • 举报
回复
我的理解是回调函数是系统调用的函数,如窗口过程函数,每个由系统调用的函数
都有他固定的一些参数,不知对否
CandyCat 2001-03-19
  • 打赏
  • 举报
回复
Kevin_qing(Kevin)的例子很好噢,在我的理解,它是函数指针,可以被其他函数调用。

CandyCat 2001-03-19
  • 打赏
  • 举报
回复
首先我要很快地解釋一下什麼是 callback 函式。凡是由你設計而卻由 Windows 系
統调用的函式,統稱為 callback 函式。這些函式都有一定的类型,以配合 Windows
的调用操作。

繁体和简体还是有一些用法不同,上面部分是我更正过的。。。
其实我也是刚刚看到的,现学现卖。
代码嘛,我建议你看看《深入浅出MFC》的第6章,应该有所帮助。
这里可以下载繁体版,http://www.csdn.net/expert/jjhou/
建议购买简体版,更符合我们的术语和习惯
myb123 2001-03-19
  • 打赏
  • 举报
回复
听课
lgs 2001-03-19
  • 打赏
  • 举报
回复
找个母猪撞死吧!
加载更多回复(6)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧