可能是重复问题:
C中的“CALLBACK”声明是什么意思?
WindowProc()函数的原型如下:
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message , WPARAM wParan, LPARAM lParam);
但我从未遇到过 CALLBACK 关键字,我只知道回调函数是将指向另一个函数的指针传递给它的函数,那么这里的 CALLBACK 到底是什么?它有什么作用?
可能是重复问题:
C中的“CALLBACK”声明是什么意思?
WindowProc()函数的原型如下:
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message , WPARAM wParan, LPARAM lParam);
但我从未遇到过 CALLBACK 关键字,我只知道回调函数是将指向另一个函数的指针传递给它的函数,那么这里的 CALLBACK 到底是什么?它有什么作用?
这是因为Win32 API默认使用回调函数的__stdcall
调用约定。调用约定描述了函数调用在低层级别上的安排方式,包括参数如何在CPU堆栈中排列等。调用方和被调用方之间关于预期堆栈布局(即调用约定)的假设必须匹配,否则可能会出现各种问题。
历史上,在Intel CPU上有多个调用约定;如果计算非Microsoft编译器,则更多。如果计算能够调用Windows API并被其调用的其他语言,情况更加复杂。确保将Windows API回调明确标记为__stdcall
以符合WinAPI的期望是一种好习惯。在某些情况下,具体取决于编译器和设置,__stdcall
是默认的调用约定(即可以安全地省略CALLBACK),但并非总是如此。
在Win16时代,CALLBACK被定义为far pascal
。这甚至不太可能成为用户函数的默认值,特别是在C程序中。回调函数被假定具有Pascal调用约定是一种历史文物。它也作为微优化工作。