Possible Duplicate:
What does a “CALLBACK” declaration in C do?
WindowProc()函数的原型(prototype)是这样的
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message , WPARAM wParan, LPARAM lParam);
但是我从来没有遇到过CALLBACK关键字,我只知道回调函数是你传递一个指向另一个函数的指针,那么这里的CALLBACK到底是什么?它有什么作用?
#defined as __stdcall
,因为这是 Win32 API 对回调函数的假设。这是一个调用约定——它描述了函数调用在底层的排列方式——参数在 CPU 堆栈上的排列方式,等等。关于预期堆栈布局(即调用约定)的假设必须在调用者和被调用者之间匹配,否则可能会发生各种有趣的后果。
从历史上看,在 Intel CPU 上有多个调用约定;如果算上非 Microsoft 编译器,则更多。如果您计算除 C[++] 之外的能够调用和被 Windows API 调用的语言,则更多。确保您的 Windows API 回调被显式标记为 __stdcall
以匹配 WinAPI 期望是一个很好的做法。在某些情况下,根据编译器和设置,__stdcall
是默认调用约定(即您可以安全地省略 CALLBACK),但并非总是如此。
在 Win16 中,CALLBACK 被定义为 far pascal
。这更不可能成为用户函数的默认值,尤其是在 C 程序中。回调被假定为具有 Pascal 调用约定的事实是一个历史产物。它还可以作为微优化。