gpt4 book ai didi

c++ - 我需要在这个函数前加上 __stdcall 前缀吗?

转载 作者:行者123 更新时间:2023-11-28 04:58:55 25 4
gpt4 key购买 nike

在学习调试 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,我不确定它是否被识别,但不管它是否抛出了一个错误:

"Expected initialiser before glCheckError_"

因为我的回调函数是void __stdcall glCheckError_(/Params/)。删除 __stdcall 前言使程序在没有它的情况下也能正常工作。

我想知道这个前缀对于 Windows 还是 Linux 是否是必需的?有趣的是,建议我将 __stdcall 添加到函数签名的地方是 Khronos 网页,它包含 OpenGL 的文档,据我所知,它不应该指定特定于操作系统的信息,因为 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

关于c++ - 我需要在这个函数前加上 __stdcall 前缀吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46536692/

25 4 0
文章推荐: html - 悬停固定位置
文章推荐: html - 带按钮的多个下拉菜单
文章推荐: javascript - Firefox 的 Web 扩展
文章推荐: javascript - 单击按钮时如何使
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com