在Win-32 c++应用程序中CALLBACK关键字是什么意思?
What does the CALLBACK keyword mean in a Win-32 C++ application?
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
相关文章:
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- "friend"关键字在C++中是什么意思?
- 关键字使用的功能是什么?
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- ELI5 函数名称后面的"&&"关键字是什么意思
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 内联函数 - 相对于内联关键字,它们到底是什么
- C++中"using"关键字背后的逻辑是什么?
- c++ 类访问关键字"signals"是什么意思?
- CppUTest中extern关键字的替代方案是什么
- 摩西源代码中的关键字可变是什么?
- C++中的"and"、"or"等关键字的目的是什么?
- 函数参数之前的类关键字是什么
- c++函数签名的附加关键字是什么
- MSVC 中"interface"关键字是什么?
- 使用' operator '关键字是什么意思?
- 在Win-32 c++应用程序中CALLBACK关键字是什么意思?
- 当重写一个方法时,虚拟关键字是什么意思
- 在c++代码中,以下关键字是什么意思?SIGSELECT,U32,U16,U8