可能重复:
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 到底是什么?它有什么作用?
它是 #defined as __stdcall
,因为这是 Win32 API 对回调函数的假设。这是一个调用约定——它描述了函数调用在低级别上的排列方式——参数在 CPU 堆栈上的排列方式等等。关于预期堆栈布局(即调用约定)的假设必须在调用者和被调用者之间匹配,否则可能会出现各种有趣的后果。
从历史上看,在 Intel CPU 上有多种调用约定。如果算上非 Microsoft 编译器,则更多。如果您计算除 C[++] 之外的能够调用和被 Windows API 调用的语言,那就更是如此。确保您的 Windows API 回调被明确标记为__stdcall
与 WinAPI 预期匹配是一种很好的做法。在某些情况下,取决于编译器和设置,__stdcall
是默认调用约定(即您可以安全地省略 CALLBACK),但并非总是如此。
回到 Win16,CALLBACK 被定义为far pascal
. 这更不可能成为用户函数的默认值,尤其是在 C 程序中。回调被认为具有 Pascal 调用约定的事实是一个历史产物。它也起到了微优化的作用。