【问题标题】:Do I need to prefix this function with __stdcall?我需要在这个函数前面加上 __stdcall 吗?
【发布时间】:2018-03-14 04:25:37
【问题描述】:

在学习调试 OpenGL 时,我实现了一个回调函数,当出现问题时,它会从 OpenGL API 接收任何调试错误消息。在教程中它说函数签名是:

typedef void APIENTRY funcname(GLenum source​, GLenum type​, GLuint id​,
   GLenum severity​, GLsizei length​, const GLchar* message​, const void* userParam​);

所以在 Windows 上我实现了这个回调。在 Windows 上 APIENTRY 是 __stdcall 的定义。 __stdcall 我相信是指定调用约定的特定于 Windows 的关键字。后来我将我的代码移植到 Linux 上,对于初学者来说,我的 Eclipse 的 GCC 无法识别 APIENTRY,因为它是 Windows 定义的。所以我把它改成了__stdcall,我不确定它是否识别,但不管它是否抛出了一个错误说:

"glCheckError_ 之前的预期初始化程序"

因为我的回调函数是 void __stdcall glCheckError_(/Params/)。 删除 __stdcall 前言可以使程序在没有它的情况下正常工作。

我想知道这个前缀对于 Windows 或 Linux 是否是必需的?有趣的是,建议我将 __stdcall 添加到函数签名的地方是 Khronos 网页,该网页包含 OpenGL 的文档,所以据我所知,它不应该指定特定于操作系统的信息,因为 OpenGL 是跨平台的。平台。那么我需要这个 __stdcall 前缀吗?

【问题讨论】:

  • 该关键字特定于 Visual C++
  • APIENTRY 和 __stdcall,对吗?我觉得奇怪的是 OpenGL 文档提到以这种方式进行回调。因为它不是特定于 Windows 的教程。
  • APIENTRY 被 #定义为 __stdcall
  • @Asesh 是的,我很想把它排除在外,等着看会发生什么。这是一个由OpenGL API调用的回调,所以我猜它与Windows无关,即Windows没有调用回调。虽然在 Windows 上使用 OpenGL 时是否需要这个 __stdcall,但我不知道。嗯,我可以试试看。
  • @Asesh 这里以“回调函数的类型为:khronos.org/opengl/wiki/Debug_Output#Getting_messages

标签: c++ opengl callback stdcall


【解决方案1】:

在 Windows 上,并且仅在 32 位下,它会有所作为。 (默认是 __cdecl 调用约定,相对于 openGL 使用的 __stdcall)。如果您使用错误的约定,这最终可能会破坏堆栈(编译器应该会出错)。

在 64 位 Windows 上,它没有区别(因为 stdcall 不可用,所以所有 __stdcall/__cdecl 将默认为 __fastcall)。

对 linux/macos/android/ios 没有影响。

只需将其包装在宏中即可。

#if definded(_WIN32) && !defined(_WIN64)
# define STDCALL __stdcall
#else 
# define STDCALL 
#endif

【讨论】:

  • 真的吗?这很有帮助。我做了一些搜索,包括在 SO 上阅读一些关于调用约定差异的答案,从未提及过 32 位与 64 位业务。谢谢。
  • 是的。在 64 位窗口上,调用约定有两个选项:__fastcall 或 __vectorcall,其中 __vectorcall 在传递浮点/向量参数时使用更多寄存器(而不是回退到堆栈)。 Linux/BSD/Macos 都只使用 __vectorcall(与使用的通用寄存器略有不同 - 不是真正的问题)您唯一的其他选择(适用于所有平台)是 'extern "C"'(禁用 C++ 名称mangling),或者不使用 extern C (启用 C++ name mangling)。
猜你喜欢
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 2019-02-28
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多