《c++回调函数总结及回调函数的封装资料》由会员分享,可在线阅读,更多相关《c++回调函数总结及回调函数的封装资料(5页珍藏版)》请在金锄头文库上搜索。
1、C+ 回调函数总结一、函数指针回调机制在 C 语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调(注意分清回调函数和被调函数的概念,以便于在下文论述中理解)。因此,要实现回调,必须首先定义函数指针,请看下面的例子:void Func (char *s);/ 函数原型void (*pFunc) (char *);/ 函数指针可以看出,函数的定义和函数指针的定义非常类似。一般情况下,为了简化函数指针类型的变量定义,提高程序的可读性,我们需要把函数指针类型自定义一下。typedef void(*pcb) (char *);回调函数也可以像普通函数一样被程序调用,但是只有它被当
2、作参数传递给被调函数时才能称作回调函数。被调函数:void GetCallBack (pcb callback)/*do something*/用户在调用上面的函数时,需要自己实现一个pcb 类型的回调函数:void fCallback (char *s)/* do something */然后,就可以直接把fCallback 当作一个参数传递给GetCallBack。GetCallBack(fCallback);二、什么是回调函数总结上述示例,回调函数就是一个通过函数指针调用的函数。如果你把函数指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。
3、回调函数是继续自C 语言的,因而,在C+中,应只在与C 代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C+中应使用虚拟方法或函数符(functor),而不是回调函数。三、标准调用约定到目前为止,我们只讨论了函数指针及回调而没有去注意 ANSI C/C+ 的编译器规范。许多编译器有几种调用约定。Visual C/C+ 的编译器支持如下的函数调用约定:关键字清理堆栈参数入栈顺序_cdecl调用函数由右至左_stdcall被调用函数由右至左_fastcall被调用函数由右至左thiscall (非关键字)被调用函数由右至左任何支持开发基于 Win32 的程序都必须支持 _
4、stdcall 扩展或其等价物。以_stdcall 标识的函数使用了标准调用约定,为什么叫标准约定呢,因为所有的Win32 API(除了个别接受可变参数的除外)都使用它,这也是Pascal 的标准约定。与之相对应的是C/C+调用约定,为强制函数使用C/C+调用约定,可使用_cdecl,另外,可变参数函数也使用C/C+调用约定。Windows 操作系统采用了标准调用约定(Pascal 约定),因为其可减小代码的体积。如果不喜欢_stdcall,还可以使用CALLBACK 宏,它定义在windef.h 中:#define CALLBACK _stdcallor#define CALLBACK PA
5、SCAL / 而PASCAL 在此被#defined 成_stdcall四、简单示例int _stdcall CompareInts(const byte* velem1, const byte* velem2)int elem1 = *(int*)velem1;int elem2 = *(int*)velem2;if(elem1 elem2)return 1;return 0;int _stdcall CompareStrings(const byte* velem1, const byte* velem2)const char* elem1 = (char*)velem1;const ch
6、ar* elem2 = (char*)velem2;return strcmp(elem1, elem2);int main(int argc, char* argv)int i;int array = 5432, 4321, 3210, 2109, 1098;cout Before sorting ints with Bubblesortn;for(i=0; i 5; i+)cout arrayi n;Bubblesort(byte*)array, 5, sizeof(array0), &CompareInts);cout After the sortingn;for(i=0; i 5; i
7、+)cout arrayi n;const char str510 = estella,danielle,crissy,bo,angie;cout Before sorting strings with Quicksortn;for(i=0; i 5; i+)cout stri n;Quicksort(byte*)str, 5, 10, &CompareStrings);cout After the sortingn;for(i=0; i 5; i+)cout stri CompareInts2(velem1, velem2);void CompareInts2 (const byte* velem1, const byte* velem2)/ do something;