“a”是什么意思;“回调”;C语言的声明?

“a”是什么意思;“回调”;C语言的声明?,c,windows,syntax,callback,C,Windows,Syntax,Callback,我在浏览库中的一些代码时,发现了一个声明如下的函数: LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 现在,我是一名德尔福编码员。没有,先生。但我从大学课程中记住了足够多的语法,可以这样读: LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 函数名为WndProc。参数列表非常简单。函数返

我在浏览库中的一些代码时,发现了一个声明如下的函数:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
现在,我是一名德尔福编码员。没有,先生。但我从大学课程中记住了足够多的语法,可以这样读:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
函数名为WndProc。参数列表非常简单。函数返回类型为LRESULT。但那个“回调”到底在那里干什么?在Delphi中,任何函数都可以用作回调函数;您只需要传递正确类型的函数指针。有没有什么特别的原因使C不能那样工作?或者它的意思不同?

回调是一种调用约定。还有其他类型的呼叫约定。回调与u stdcall相同

更多信息请访问Raymond Chen的博客:


这是通话惯例。当您将指向此函数的指针传递给Windows API(该API稍后将调用该函数)时,这是必需的。Windows调用约定不同于C调用约定,因此您需要向编译器指定WndProc()是特殊的,并且它需要不同的启动和清理代码。

这是一种调用约定,Delphi也有它们。尝试在Delphi帮助中查找“cdecl”。在Delphi(或者我们老朋友喜欢称之为Object Pascal)中,调用约定在函数声明之后,如下所示

function MyFunction(X, Y: Real): Real; cdecl;

陈雷蒙博客的简短综述:

打电话的好处 x86平台上的约定是 有这么多可供选择的

C呼叫约定(cdecl)

C调用约定受到限制,因为它允许使用参数数量可变的函数。它几乎需要清理堆栈,并将参数从右向左推,以便第一个参数位于相对于堆栈顶部的固定位置。总之:调用者清理堆栈,参数从右向左推

帕斯卡呼叫约定(帕斯卡)


Pascal不支持参数数目可变的函数,因此它可以使用被调用方清理约定。参数从左向右推。几乎所有Win16函数都以Pascal调用约定导出。被调用方清理约定在每个调用点保存三个字节,每个函数的固定开销为两个字节。它也稍微快一点。在Win16上,节省几百字节和几个周期是一件大事。注意:Fortran调用约定(_Fortran)与Pascal调用约定相同