函数无法匹配 GLDEBUGPROC,仅在 MSVC 上(使用相同的 glew 版本 2.1.0,在 Linux 上使用 gcc/clang 没问题)

2024-01-09

我定义了以下函数,用于glDebugCallback,它与 Linux 上的 GCC 和 Clang 完美配合。但是在 Windows 上,以下代码不想注册为 OpenGL 的调试回调:

inline void messageCallback(GLenum source, GLenum type, GLuint id, 
                            GLenum severity, GLsizei length, const GLchar* message, 
                            const void* userParam) {
    // ...
}

然后我设置它

glDebugMessageCallback(messageCallback, nullptr);

查找 glew 标头的内容后,它显示:

typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, 
                                       GLsizei length, const GLchar* message, 
                                       const void* userParam);

但我收到一条错误消息:

错误(活动)E0167 类型“void (*)(GLenum 源、GLenum 类型、GLuint id、GLenum 严重性、GLsizei 长度、const GLchar *message、const void *userParam)”类型的参数与“GLDEBUGPROC”类型的参数不兼容

我一直试图找出为什么它只在 MSVC 上失败......但我很困惑,因为它看起来像逐字匹配。事实上它在 GCC/Clang 上编译也有点令人困惑,我不确定我错过了什么或者为什么会发生这种情况。

请注意,inline关键字不会影响结果,我在没有关键字的情况下尝试过,也存在同样的问题。我只是将其保留在那里,因为我想复制并粘贴确切的内容。我还通过差异检查器检查了参数是否有任何错误,但它们是相同的。

这是在 Visual Studio 2017 中,使用 C++17、glew 2.1.0、现代 Opengl 等。我的 OpenGL 版本也是 4.6。


您可能需要包括GLAPIENTRY预选赛:

void GLAPIENTRY messageCallback(...)

这指定了一个调用约定,告诉编译器修改函数参数的传递方式。在某些平台上这没有什么区别,但我猜在 Windows 上可能会有区别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数无法匹配 GLDEBUGPROC,仅在 MSVC 上(使用相同的 glew 版本 2.1.0,在 Linux 上使用 gcc/clang 没问题) 的相关文章

随机推荐