zl程序教程

您现在的位置是:首页 >  后端

当前栏目

为什么只有静态成员函数才能作为回调函数?

静态 函数 为什么 作为 成员 回调 才能 只有
2023-09-14 09:10:45 时间

隐藏的this指针

对于非静态成员函数来说,它携带了一个隐藏的”this”指针,这导致它不能满足Win32回调函数签名的要求,这样的结果就是:一个非静态成员函数,不能作为一个合法的Win32回调函数。
幸运的是,几乎所有的回调函数都提供了一些方法来感知调用上下文。你可以将这个”this”指针作为一个上下文环境来重构代码,下面是一个例子:

 

有一些回调函数签名将它的第一个参数作为指示上下文的参数(也叫做”引用数据”)。凑巧的是,这个隐藏的”this”指针也正好是第一个参数。回顾我们之前关于调用约定的文章,可以知道对于成员函数的__stdcall调用约定也刚好匹配我们预期的栈布局。下面我们看一个WAITFORTIMERCALLBACK的例子:

 

请注意:”thiscall”调用约定不能匹配上面的场景,但是两个”__stdcall”却可以。幸运的是,编译器足够聪明,它能识别这个this指针,并对上面的静态成员函数s_ThreadProc进行优化。

 

如果你有机会观察一下编译器为s_ThreadProc生成的汇编代码,则你会发现:函数的实现实际上就是一个跳转指令&#