理解这个opengl代码

时间:2010-10-02 23:02:26

标签: c opengl glut

我是一名Java程序员,第一次在C语言学习opengl。我想解剖一下这个简单的代码,我的导师给了我很多解释:

void renderScene (void) {
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
        glVertex3f(-0.5,-0.5,0.0);
        glVertex3f(0.5,0.0,0.0);
        glVertex3f(0.0,0.5,0.0);
    glEnd();
    glFlush();


   void init(); {
       int submenu;
       submenu = glutCreateMenu(menuApp);
       glutAddMenuEntry("Option A",1);
       glutAddMenuEntry("Option B",2);
       glutAddMenuEntry("Option C",3);

       glutCreateMenu(menuApp);
       glutAddSubMenu("SubMenu",submenu);
       glutAddMenuEntry("Salir",4);

       glutAttachMenu(GLUT_RIGHT_BUTTON);


   }

}

问题:

a)void renderScene (void)的含义是什么?为什么这个函数需要void参数?

b)到底是什么void init(); {}?两个为什么;和{}?为什么里面 renderScene函数?

4 个答案:

答案 0 :(得分:2)

void renderScene (void)是C的说法“声明renderScene作为一个不带参数且不返回任何值的函数”void renderScene()会有所不同 - 它是C中过时的函数声明样式,声明renderScene采用固定但未指定数量的参数。

另一部分有点奇怪,并以误导的方式格式化。格式正确,它会显示:

void init();

{
     int submenu;
     submenu = glutCreateMenu(menuApp);
     glutAddMenuEntry("Option A",1);
     /* ... */
}

{ }内的区块与void init();无关。 void init();声明了一个名为init的函数(它是上面提到的过时的函数声明样式)。函数声明只是向编译器说“在某个地方有一个叫做this的函数,这就是它的参数和返回值是什么”。由于永远不会调用init函数,因此可以省略此行。

{ }内的块只是一个复合语句。它只是打开一个新的范围 - 变量submenu的范围仅限于该块。


值得指出的是,声明void init();本身就是一个时代错误 - 它是一个声明,它出现在同一个块中的代码之后,这是1999年C版标准中添加的一个特性,但它是一个没有原型的声明,正如前面提到的1989 C标准所述。

另请注意,不在文件范围内的函数声明本身有点不寻常,尽管完全合法。

答案 1 :(得分:1)

具有参数renderScene的函数void表示它不接受任何参数。

init函数初始化程序。换句话说,它启动并准备好做某事。

应定义init函数

void init(){
...

}

而不是

void init();{
...
}

并且不应该renderScene内。

答案 2 :(得分:1)

void renderScene (void)表示该函数不带参数。

它类似于Java中的void renderScene()。

  

什么是无效的init(); {}?

可能是一个错字,The;不应该在那里。

  

为什么它在renderScene函数中?

可能是另一个错字,renderScene应该有另一个}

答案 3 :(得分:0)

如果您发布的代码段正确,则它是renderScene函数的定义。该函数不返回值,也不接受任何参数。

void init();是一个声明。它只是让编译器知道名为init的函数的细节,以便它可以在我们调用它时生成正确的代码 - 但它是一个不完整的声明(对编译器没什么帮助)并且它不会在任何地方被调用声明在范围内。所以,它基本上只是噪音。

如果我们忽略它并继续使用{,则下一行是一组可能引入submenu变量的语句,它只存在于这个新块中。