8

Win-32 C++ 应用程序中的一些函数调用应用了CALLBACK关键字,如下例所示(取自此 MSDN 页面):

BOOL CALLBACK DeleteItemProc(HWND hwndDlg, UINT message,
                             WPARAM wParam, LPARAM lParam) 
{
    // ... code here ...
}

我通过 Visual Studio 看到CALLBACK关键字被定义(使用#define)为__stdcall. __stdcall 文档并没有让它更清楚(至少对我来说)它的作用。

简而言之,usingCALLBACK对我有什么用?它是绝对必要的,还是我可以不做那个声明?

4

3 回答 3

27

这是必需的,__stdcall 不是大多数编译器的默认调用约定。__cdecl 是正常的默认值。调用约定错误将使您的程序行为异常,难以诊断。参数值错误,堆栈变得不平衡。

这只是 32 位代码的问题,64 位代码只有一个调用约定。谁再添一个,谁就将被立即禁止在南大西洋的一个小岛上生活。__stdcall 是一个历史性的事故,始于 DOS 和 16 位 Windows 中的 pascal 调用约定,当可用内存如此之少时,从调用中删除指令很重要。

于 2013-02-28T02:38:32.933 回答
2

CALLBACK不是关键字。它只是一个预处理器宏,它被适当的调用约定替换,正如您已经注意到的那样,它是__stdcall.

这是一种“类似 Pascal”的调用约定,不支持可变数量的参数,Win32 API 从早期就使用它,并且由于历史原因仍然存在。

于 2013-02-28T02:49:43.407 回答
0

CALLBACK被定义为__stdcall机制。但这本身就是一个函数,它会在发生事件(比如)时被其他函数调用。

是必须的吗?是的!为什么?因为默认是__cdecl

于 2013-02-28T02:36:00.930 回答