【发布时间】: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