回调函数

一、回调函数的概念

回调函数就是一个通过函数指针被调用的函数。如果把函数A的指针(入口地址)作为参数传递给函数B,在函数 B中通过指针调用A,则称A为回调函数。A一般不是由B直接调用,而是在特定的事件或者条件发生时由另一方(如定时函数)调用。函数关键词 CALLBACK

1、关键词CALLBACK

CALLBACK== WINAPI ==__stdcall

实际上就是一种调用模式,就是约定由调用函数来自行解决压栈参数,同 pascal 调用

#define CALLBACK    __stdcall
#defineWINAPI      __stdcall
#defineWINAPIV     __cdecl
#defineAPIENTRY    WINAPI
#defineAPIPRIVATE __stdcall
#definePASCAL     __stdcall
#define cdecl _cdecl
#ifndef CDECL
#define CDECL _cdecl
#endif


2、回调函数的实现机制

1)定义一个回调函数。

voidfunc()
{
    printf("I'm the callbackfunction.\n");
}


2) 提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;

typedefvoid (*pFunc)();
pFunc= func;


3) 当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

例如:回调可用于通知机制。

有时要在B程序中设置一个计时器,每到一定时间,B程序会得到相应的通知,但通知机制的实现者对A程序一无所知。那么,就需一个具有特定原型的函数指针进行回调,通知A程序事件已经发生。实际上,API使用一个回调函数SetTimer()来通知计时器。

SetTimer(1,1,pFunc);//设置一个计时器,ID为1,每隔1秒调用一次回调函数func

另一个使用回调机制的API函数是EnumWindow(),它枚举屏幕上所有的顶层窗口,每个窗口都可以通过它调用另一个程序提供的函数,并传递窗口的处理程序。例如:如果被调用者返回一个值,就继续进行迭代;否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。

3、说明:

a>函数必关键词 CALLBACK

b>函数本身必是全局函数或者静函数,不可定义为某个特定的的成函数

c>函数通常作参数传递给API,由API函数可能被系API用一次,也可能被循环调用多次

不管怎么说,回调函数是继承自C语言的。在C++中,应只在与C代码建立接口或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或仿函数(functor),而不是回调函数。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值