我是一名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
函数?
答案 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
变量的语句,它只存在于这个新块中。