我是否需要使用__stdcall为此函数添加前缀?

时间:2017-10-03 03:16:09

标签: c++ opengl callback stdcall

当学习调试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前缀吗?

1 个答案:

答案 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