使用 GLUT 时避免全局变量

Max*_*iso 5 c++ glut scope

GLUT 是一个很棒的 AP​​I,它非常易于使用,但我在处理范围方面遇到了一些困难。在定义回调时,没有传递参数的选项,所以在我看来好像程序员被迫依赖全局变量,我发现这很难接受。现在我在它自己的模块中拥有所有的 GLUT 代码,在它自己的线程上运行,并定义一个静态指针,我在入口点分配给模块,如下所示:

主模块

int main( int argc, char** argv ) {
    int foo;
    boost::thread graphicsThread(glutMain, argc, argv, &foo);

    //...

    graphicsThread.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

GLUT 模块

static int* FOO_REF;

int glutMain( int argc, char** argv, int* foo ) {
    FOO_REF = foo;
    glutInit(&argc, argv);
    //etc...
Run Code Online (Sandbox Code Playgroud)

还有比这更好的解决方案吗?

Fle*_*exo 1

如果您正在使用 freeglut 或其衍生物,并且愿意将自己限制在 freeglut 衍生物上,那么它有一个非标准扩展来准确解决问题。您可以将 avoid*与每个窗口相关联。如果您将其设为包含您想要的所有每个窗口数据的结构,则可以完全避免全局变量。

概要:

#include <GL/glut.h>
#include <GL/freeglut_ext.h>


void * glutGetWindowData();
glutSetWindowData(void *data);
Run Code Online (Sandbox Code Playgroud)