OpenGL加载程序定义函数指针的原因

OpenGL加载程序定义函数指针的原因,opengl,Opengl,在我使用过的OpenGl加载器(GLLoaderGenerator,GLEW)中,标题看起来像: extern void (CODEGEN_FUNCPTR *_ptrc_glBindVertexBuffer)(GLuint, GLuint, GLintptr, GLsizei); #define glBindVertexBuffer _ptrc_glBindVertexBuffer 。。。好的,GLEW在几个宏后面隐藏了这一点,但它的结果几乎相同。。 所以我的问题是-是否有特殊的原因来定义一个

在我使用过的OpenGl加载器(GLLoaderGenerator,GLEW)中,标题看起来像:

extern void (CODEGEN_FUNCPTR *_ptrc_glBindVertexBuffer)(GLuint, GLuint, GLintptr, GLsizei);
#define glBindVertexBuffer _ptrc_glBindVertexBuffer
。。。好的,GLEW在几个宏后面隐藏了这一点,但它的结果几乎相同。。 所以我的问题是-是否有特殊的原因来定义一个具有某个名称(_ptrc_XXX)和#定义我想要使用的名称的函数指针?为什么不简单地使用:

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

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

扩展加载程序库不是OpenGL实现,而是第三方库。因此,最好不要涉足OpenGL保留的名称空间,即以
gl…
开头的符号。相反,这种扩展加载程序将符号加载到自己的名称空间中,如
\u ptrc\u glew…
,并使用一些预处理器宏技巧在使用该库的代码中透明地“重命名”符号引用


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

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