c++ - 如何在调用原始方法之前覆盖全局方法名称以将我的代码推送到前面

标签 c++ c opengl

我正在尝试在 OpenGL 之上创建一个 API,并且我希望在不先运行整个纹理处理程序的情况下不允许对 glActiveTexture 进行任何调用。本质上,有人需要为 glActiveTexture 方法提供一个 ID,我想检查该插槽是否未在使用,如果它是我想重定向他们的请求。我想以某种方式执行此操作,以某种方式允许我在使用该方法之前将代码注入(inject)该方法,因此让代码如下所示:

void glActiveTexture(int id){
    {opengl code}
}


//...some other file
int main(){
    glActiveTexture(2);
}

我想做一些宏技巧或重载技巧,以便能够使代码实际调用我的 glActiveTexture 版本,以便它可以执行以下操作:
void glActiveTexture(int id){
    {my code}
    {opengl code}
}


//...some other file
int main(){
    glActiveTexture(2);
}

我不太擅长宏或多个同名方法的注意事项,但如果有一种 100% 的方法可以让它通过 opengl 调用我的方法,那就太好了。如果没有,您是否知道处理此类事情的任何方法。本质上,我需要控制用户何时调用以更改程序的内部状态(glActiveTexture 调用),并且我希望以一种让 opengl 程序员仍然使用他们通常使用的相同语法的方式来做到这一点。

最佳答案

最好的方法是使用预处理器宏。您可以使用以下代码,确保将其放在一个通用的包含文件中,该文件包含在代码中的任何位置。

mygl.h:

// we will have to make sure that gl.h is inlcuded before our redefine
#include <gl/gl.h>

// we will check if it's not included from the implementation
#ifndef _DONTMANGLE
#define glActiveTexture myActiveTexture
#endif

其中gl.h在宏确保您覆盖默认的 GL 行为之前。我们使用 _DONTMANGLE定义以确保函数名称不会被重写实现源文件中的预处理器破坏,以便我们仍然能够调用原始函数。
然后在代码中的某处定义你的函数:

mygl.c:
#define _DONTMANGLE
#include "mygl.h"

void myActiveTexture(GLint n)
{
    /// your code here
    return glActiveTexture(n);
}

请注意,在某些 GL 库中(如 MESA,或在使用 GLEE/GLEW 助手时)glActiveTexture可能已经是定义的宏,所以不要使用 #undef重新定义之前就可以了!

编辑:

我忘记了,你不应该包含 #define托管 myActiveTexture 的源文件中的头文件功能。否则,您将无法调用glActiveTexture ,因为它会导致递归!另一种方法是在适用的情况下使用定义来排除重整。我已经更新了样本。

关于c++ - 如何在调用原始方法之前覆盖全局方法名称以将我的代码推送到前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60144771/

相关文章:

math - 投影球体的半径

c++ - OpenGL 中一致的手绘线

c++ - 将 bool 传递给 const std::string& 的异常

c++ - 在通用 C++ 代码中移动基于范围的循环?

c++ - 为 Eigen 和 std::vectors 编写模板函数

c++ - 绘图圆,OpenGL 风格

c - 结构数组在声明时存储垃圾

c - 链接时出现错误 "multiple definitions"的原因可能是什么?

c++ - 使用动态数组的简单地址簿

c++ - QT和QGLViewer程序中如何改变QGLViewer默认的远近裁剪距离?