在Win-32 c++应用程序中CALLBACK关键字是什么意思?

What does the CALLBACK keyword mean in a Win-32 C++ application?

本文关键字:关键字 是什么 意思 CALLBACK Win-32 c++ 应用程序      更新时间:2023-10-16

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

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

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

简而言之,使用CALLBACK对我做什么?这是绝对必须的吗,还是我可以不申报?

这是必需的,__stdcall不是大多数编译器的默认调用约定。__cdecl是正常的默认值。错误的调用约定将使您的程序以一种难以诊断的方式出错。实参值错误,导致栈不平衡。

这只在32位代码中有问题,64位代码只有一个调用约定。无论谁再增加一个,都将被立即禁止在南大西洋的一个小岛上生活。__stdcall是一个历史性的意外事件,它始于DOS和16位Windows中的pascal调用约定,当时在可用内存很少的情况下,从调用中删除一条指令非常重要。

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

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

CALLBACK定义为__stdcall机制。但它本身是一个函数,当事件发生时,它会被其他函数调用。

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