【问题标题】:OpenGL loader Reason to #define function pointerOpenGL loader #define 函数指针的原因
【发布时间】:2014-09-12 08:21:15
【问题描述】:

在我使用的 OpenGl-loader (GLLoaderGenerator, GLEW) 中,标题看起来像:

extern void (CODEGEN_FUNCPTR *_ptrc_glBindVertexBuffer)(GLuint, GLuint, GLintptr, GLsizei);
#define glBindVertexBuffer _ptrc_glBindVertexBuffer

...好吧,GLEW 将其隐藏在几个宏后面,但结果几乎相同.. 所以我的问题是 - 是否有特定的理由来定义一个具有某个名称 (_ptrc_XXX) 的函数指针和 #define 我想要使用的名称?为什么不简单地使用:

extern void (CODEGEN_FUNCPTR *glBindVertexBuffer)(GLuint, GLuint, GLintptr, GLsizei);

【问题讨论】:

  • 由于#define 只是一个重命名,它可以在这种情况下工作。

标签: opengl


【解决方案1】:

这样做是为了避免命名空间冲突。 OpenGL 指定的名称和 OpenGL 扩展保留供 OpenGL 实现使用。各种操作系统 OpenGL 标准 ABI^1 的更高版本可能会突然暴露该命名空间中的符号,这会破坏与库链接的程序,这些库也定义了这些符号。

扩展加载程序库不是 OpenGL 实现,而是第 3 方库。因此,最好不要进入为 OpenGL 保留的命名空间,即以gl… 开头的符号。相反,此类扩展加载器将符号加载到它们自己的命名空间中,例如_ptrc_glew…,并使用一些预处理器宏技巧来透明地“重命名”使用该库的代码中的符号引用。


1:ABI = 关于某个 API 必须提供什么以及接口如何在较低级别完成的规范。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 2016-11-18
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多