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

时间:2012-06-16 18:56:51

标签: windows winapi

  

可能重复:
  What does a “CALLBACK” declaration in C do?

WindowProc()函数的原型是这个

      LRESULT CALLBACK WindowProc(HWND hWnd,UINT message , WPARAM wParan, LPARAM lParam);

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

1 个答案:

答案 0 :(得分:8)

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

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

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