【问题标题】:What does a "CALLBACK" declaration in C do?C 中的“CALLBACK”声明有什么作用?
【发布时间】:2009-02-09 23:17:30
【问题描述】:

我正在查看SDL 库中的一些代码,发现一个函数声明如下:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

现在,我是一名 Delphi 编码员。没有 hablo C muy bien,先生。但我记得我大学课程的语法足够多,可以这样阅读:

函数名称是 WndProc。参数列表是不言自明的。函数返回类型是 LRESULT。但是那个“CALLBACK”到底在做什么呢?在 Delphi 中,任何函数都可以用作回调;您只需要传递正确类型的函数指针。有什么特别的原因导致 C 不能这样工作吗?还是有不同的意思?

【问题讨论】:

    标签: c windows syntax callback


    【解决方案1】:

    “CALLBACK”是一种调用约定。还有其他类型的调用约定。 CALLBACK 与 __stdcall 相同。

    http://www.codeguru.com/cpp/cpp/cpp_mfc/callbacks/article.php/c10557

    Raymond Chen 博客上的更多信息:

    http://blogs.msdn.com/oldnewthing/archive/2004/01/08/48616.aspx

    【讨论】:

    • 请注意,Raymond 的博客现在是 here
    【解决方案2】:

    Raymond Chen 博客的简短综述:

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

    C 调用约定 (__cdecl)

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

    Pascal 调用约定 (__pascal)

    Pascal 不支持具有可变数量参数的函数,因此它可以使用 callee-clean 约定。参数从左到右推送。几乎所有 Win16 函数都导出为 Pascal 调用约定。 callee-clean 约定在每个调用点保存三个字节,每个函数有两个字节的固定开销。它也快了一点。在 Win16 上,节省几百字节和几个周期是一件大事。注意:Fortran 调用约定(__fortran)与 Pascal 调用约定相同

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-03-01
          • 1970-01-01
          • 2010-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-04
          • 1970-01-01
          相关资源
          最近更新 更多