我需要以__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,对于Eclipse的GCC而言,我无法识别Apientry,因为它是Windows定义。因此,我将其更改为__STDCALL,我不确定它是否识别,但是无论如何都丢了一个错误:

"

因为我的回调函数是void __ stdcall glcheckerror _(/ params /)。删除__ stdcall序言使程序可以正常工作。

我想知道Windows还是Linux是否需要此前缀?有趣的是,建议我在功能签名中添加__stdcall的地方是Khronos网页,该网页上有OpenGL的文档,因此据我所知,它不应指定特定于OS的信息,因为OpenGL是cross-平台。那么我需要这个__ stdcall前缀吗?

在Windows上,仅在32位以下,然后会有所作为。(默认值为__ cdecl调用约定,v.s。opengl使用的__STDCALL)。如果您使用错误的惯例,这最终可能会破坏堆栈(编译器在任何运气时都应错误)。

在64位Windows上,它没有区别(因为没有STDCALL,因此所有__STDCALL/__ CDECL默认为__fastCall)。

这与Linux/MacOS/Android/ios没有区别。

将其包裹在宏中应该是所有需要的。

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

最新更新