在我使用的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);
答案 0 :(得分:1)
这样做是为了避免命名空间冲突。 OpenGL和OpenGL扩展指定的名称保留供OpenGL 实现使用。各种操作系统OpenGL标准ABI ^ 1的更高版本可能会突然暴露该命名空间中的符号,这会破坏与库链接的程序,这也会定义这些符号。
扩展加载程序库不是OpenGL实现,而是第三方库。因此,最好不要进入为OpenGL保留的命名空间,即以gl…
开头的符号。相反,这些扩展加载器将符号加载到它们自己的命名空间中,如_ptrc_glew…
,并使用一些预处理器宏技巧在使用该库的代码中透明地“重命名”符号引用。
1:ABI =关于某个API必须提供什么以及如何在较低级别完成接口的规范。