大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C++技巧 > C/C++中回调函数初探

C/C++中回调函数初探(2)

关键词:C/C++回调函数  阅读(1074) 赞(12)

[摘要]本文主要是对C/C++中回调函数初探的讲解,希望对您学习C++有所帮助!

  调用商定

  上面的代码中,可在函数原型中找到__stdcall,由于它以双下划线打头,所以它是一个特定于编译器的扩展,说终究也就是微软的完成。任何支持开发基于Win32的顺序都必需支持这个扩展或其等价物。以__stdcall标识的函数运用了标准调用商定,为什么叫标准商定呢,由于一切的Win32 API(除了普通接受可变参数的除外)都运用它。标准调用商定的函数在它们前往到调用者之前,都会从堆栈中移除掉参数,这也是Pascal的标准商定。但在C/C++中,调用商定是调用者担任清算堆栈,而不是被调用函数;为强迫函数运用C/C++调用商定,可运用__cdecl。另外,可变参数函数也运用C/C++调用商定。

  Windows操作系统采用了标准调用商定(Pascal商定),由于其可减小代码的体积。这点对早期的Windows来说非常重要,由于那时它运转在只需640KB内存的电脑上。

  假定你不喜欢__stdcall,还可以运用CALLBACK宏,它定义在windef.h中:

#define CALLBACK __stdcallor

#define CALLBACK PASCAL //而PASCAL在此被#defined成__stdcall

  作为回调函数的C++方法

  由于往常很可以会运用到C++编写代码,也许会想到把回调函数写成类中的一个方法,但先来看看以下的代码:

class CCallbackTester
{
 public:
 int CALLBACK CompareInts(const byte* velem1, const byte* velem2);
};

Bubblesort((byte*)array, 5, sizeof(array[0]),
&CCallbackTester::CompareInts);

  假定运用微软的编译器,将会失掉下面这个编译错误:

error C2664: 'Bubblesort' : cannot convert parameter 4 from 'int (__stdcall CCallbackTester::*)(const unsigned char *,const unsigned char *)' to 'int (__stdcall *)(const unsigned char *,const unsigned char *)' There is no context in which this conversion is possible

  这是由于非静态成员函数有一个额外的参数:this指针,这将迫使你在成员函数前面加上static。当然,还有几种方法可以处置这个效果,但限于篇幅,就不再论述了。
«上一页12下一页»


相关评论