欢迎来到天天文库
浏览记录
ID:44694805
大小:45.50 KB
页数:5页
时间:2019-10-25
《c++回调函数总结及回调函数的封装》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、C++回调函数总结一、函数指针回调机制在C语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调(注意分清回调函数和被调函数的概念,以便于在下文论述中理解)。因此,要实现回调,必须首先定义函数指针,请看下面的例子:voidFunc(char*s);//函数原型void(*pFunc)(char*);//函数指针可以看出,函数的定义和函数指针的定义非常类似。一般情况下,为了简化函数指针类型的变量定义,提高程序的可读性,我们需要把函数指针类型自定义一下。typedefvoid(*pcb)(c
2、har*);回调函数也可以像普通函数一样被程序调用,但是只有它被当作参数传递给被调函数时才能称作回调函数。被调函数:voidGetCallBack(pcbcallback){/*dosomething*/}用户在调用上面的函数时,需要自己实现一个pcb类型的回调函数:voidfCallback(char*s){/*dosomething*/}然后,就可以直接把fCallback当作一个参数传递给GetCallBack。GetCallBack(fCallback);二、什么是回调函数总结上述示例,回调函数就是
3、一个通过函数指针调用的函数。如果你把函数指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数是继续自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或函数符(functor),而不是回调函数。三、标准调用约定到目前为止,我们只讨论了函数指针及回调而没有去注意ANSIC/C++的编译器规范。许多编译器有几种调用约定。VisualC/C++的编译器支持如下的函数调用约定:关
4、键字清理堆栈参数入栈顺序__cdecl调用函数由右至左__stdcall被调用函数由右至左__fastcall被调用函数由右至左thiscall(非关键字)被调用函数由右至左任何支持开发基于Win32的程序都必须支持__stdcall扩展或其等价物。以__stdcall标识的函数使用了标准调用约定,为什么叫标准约定呢,因为所有的Win32API(除了个别接受可变参数的除外)都使用它,这也是Pascal的标准约定。与之相对应的是C/C++调用约定,为强制函数使用C/C++调用约定,可使用__cdecl,另外,
5、可变参数函数也使用C/C++调用约定。Windows操作系统采用了标准调用约定(Pascal约定),因为其可减小代码的体积。如果不喜欢__stdcall,还可以使用CALLBACK宏,它定义在windef.h中:#defineCALLBACK__stdcallor#defineCALLBACKPASCAL//而PASCAL在此被#defined成__stdcall四、简单示例int__stdcallCompareInts(constbyte*velem1,constbyte*velem2){intelem1
6、=*(int*)velem1;intelem2=*(int*)velem2;if(elem1elem2)return1;return0;}int__stdcallCompareStrings(constbyte*velem1,constbyte*velem2){constchar*elem1=(char*)velem1;constchar*elem2=(char*)velem2;returnstrcmp(elem1,elem2);}intmain(intar
7、gc,char*argv[]){inti;intarray[]={5432,4321,3210,2109,1098};cout<<"BeforesortingintswithBubblesort";for(i=0;i<5;i++)cout<8、';constcharstr[5][10]={"estella","danielle","crissy","bo","angie"};cout<<"BeforesortingstringswithQuicksort";for(i=0;i<5;i++)cout<
8、';constcharstr[5][10]={"estella","danielle","crissy","bo","angie"};cout<<"BeforesortingstringswithQuicksort";for(i=0;i<5;i++)cout<
此文档下载收益归作者所有