繁体   English   中英

我是否需要为此函数加上__stdcall前缀?

[英]Do I need to prefix this function with __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,我不确定它是否可以识别,但是无论它是否抛出错误都说:

“ glCheckError_之前的预期初始化程序”

由于我的回调函数无效__stdcall glCheckError _(/ Params /)。 删除__stdcall前言会使该程序在没有它的情况下也可以正常工作。

我想知道对于Windows还是Linux,是否需要该前缀? 有趣的是,我建议在函数签名中添加__stdcall的地方是Khronos网页,该网页包含OpenGL的文档,据我所知,它不应该指定特定于OS的信息,因为OpenGL是跨平台的。平台。 所以我需要这个__stdcall前缀吗?

在Windows上,并且仅在32位以下,这将有所作为。 (默认值为__cdecl调用约定,而openGL使用的是__stdcall)。 如果使用错误的约定,这可能最终破坏堆栈(编译器会因运气而出错)。

在64位Windows上,这没有什么区别(因为stdcall不可用,因此所有__stdcall / __ cdecl将默认为__fastcall)。

它对linux / macos / android / ios没有影响。

将其包装在宏中应该就足够了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM