Windows API函数声明中的"CALLBACK"是什么意思?

Gho*_*ost 8 windows winapi

可能重复:
C中的"CALLBACK"声明有什么作用?

WindowProc()函数的原型就是这个

      LRESULT CALLBACK WindowProc(HWND hWnd,UINT message , WPARAM wParan, LPARAM lParam);
Run Code Online (Sandbox Code Playgroud)

但是我从来没有遇到过CALLBACK关键字,我只知道回调函数是你将指针传递给另一个函数的函数,那么这个CALLBACK到底是什么?它做了什么?

Sev*_*yev 9

它的#defined为__stdcall,因为这就是Win32 API对回调函数的假设.这是一个调用约定 - 它描述了函数调用在低级别上的排列方式 - 如何在CPU堆栈上排列参数等等.关于预期堆栈布局(即约定)的假设必须在调用者和被调用者之间匹配,否则可能会产生各种有趣的后果.

从历史上看,在Intel CPU上有多种约定; 如果计算非Microsoft编译器,则会更多.确保你的回调是__stdcall是一个很好的做法.在某些情况下,根据编译器和设置,__ stdcall是默认的调用约定(即您可以安全地省略CALLBACK),但并非总是如此.

回到Win16,CALLBACK被定义为far pascal.这甚至不太可能成为用户功能的默认设置,尤其是在C程序中.假设回调被认为具有Pascal调用约定这一事实是一个历史人工制品.

  • 您可以在函数上更改调用约定。查找关键字__cdecl,__ thiscall,__ fastcall。但是,如果该函数将由非您的代码(即Windows代码)调用,则声明该函数所使用的约定必须与该函数所调用的约定匹配。这就是__stdcall,因为这就是Windows假定的。为了方便起见,在Windows头文件中,__ stdcall的别名为CALLBACK。 (2认同)