当学习调试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上,对于初学者来说,我的GCC与Eclipse并没有认识到APIENTRY,因为它是一个Windows定义。所以我把它改成了__stdcall,我不确定它是否被识别,但不管它是不是都说错了:
" glCheckError之前的预期初始化程序_"
由于我的回调函数是void __stdcall glCheckError _(/ Params /)。 删除__stdcall前言使程序在没有它的情况下正常工作。
我想知道这个前缀是否是必要的,无论是Windows还是Linux?有趣的是,建议我将__stdcall添加到函数签名的地方是Khronos网页,其中包含OpenGL的文档,因此我可以告诉它不应该指定特定于操作系统的信息,因为OpenGL是跨平台的。那么我需要这个__stdcall前缀吗?
答案 0 :(得分:1)
在Windows上,只有32位以下,它会有所作为。 (默认为__cdecl调用约定,v.s.willGL使用的__stdcall)。如果使用错误的约定,这可能最终破坏堆栈(编译器应该运气错误)。
在64位窗口上,没有区别(因为stdcall不可用,所以所有__stdcall / __ cdecl都默认为__fastcall)。
对linux / macos / android / ios没什么影响。
在宏中包装它应该是所有需要的。
#if definded(_WIN32) && !defined(_WIN64)
# define STDCALL __stdcall
#else
# define STDCALL
#endif