`
sogotobj
  • 浏览: 619188 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

xcode4.2中更严格的语法检查--我自己的第一个opengl程序

阅读更多

声明:我下面的内容是使用Lion系统+Xcode4.2环境下做的,如果你是其他的系统和Xcode会有所不同。

很多时候,我们必须自己动手写程序,甚至是抄程序才能学好一门技术。下面我以一个opengl程序为例来讲述xcode4.2中更严格的语法检查

打开xcode,新建一个项目。选择Mac OS X下面的application,选择Command Line Tool


选择next,然后输入工程的名字,选择c语言


缺省生成的代码如下:

#include <stdio.h>


int main (int argc, const char * argv[])

{


// insert code here...

printf("Hello, World!\n");

return 0;

}



我们加入一些简单的代码,代码就不解释了,在前面的文章中有提到

#include <stdio.h>

#include <GLUT/GLUT.h>

void DisplayF()

{

glClear(GL_COLOR_BUFFER_BIT);

glFlush();

}

void setupRC()

{

glClearColor(0.1, 1.0, 1.0, 1.0);

}


int main (int argc, const char * argv[])

{


// insert code here...

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);

glutCreateWindow("test");

glutDisplayFunc(DisplayF);

setupRC();

glutMainLoop();

return 0;

}


上面的代码在编译的时候有三个警告和8个链接错误。我们需要先解决链接错误。这些链接错误是由于我们没有加入链接库。如下图


加入OpenGL.framework和GLUT.framework。

再次编译发现程序可以运行了,但是有三个警告。很多程序员习惯忽略警告,这是一个很不好的习惯,有些时候,警告可能是一个严重的会在运行的时候引起问题的错误,即使只是普通的警告,我们也应该消灭它。做为一个专业的程序员,我们必须养成这样的好习惯。

我们先看看这三个警告是什么

No previous prototype for function 'DisplayF'

No previous prototype for function 'setupRC'

Passing 'const char **' to parameter of type 'char **' discards qualifiers in nested pointer types

可以看出前两个警告是一样的,就是没有找到函数的原型声明,第三个是因为参数的修饰符引起的,第三个最好改,只需要把

int main (int argc, const char * argv[])

改为:

int main (int argc, char * argv[])

前两个我们需要加入一个头文件,比如func.h,然后放入这两个函数的声明,

#ifndef tgl0002_func_h

#define tgl0002_func_h


void DisplayF();


void setupRC();


#endif


然后在main.c中引入这个头文件,但是我们会发现还是有两个警告。经过试验后,问题在于:两个函数都没有参数,习惯性的在参数列表的地方什么都不写,现在在四个地方都加入void既可。这就是xcode4.2更严格的语法检查的一部分。最后形成的代码如下:

func.h


#ifndef tgl0002_func_h

#define tgl0002_func_h


void DisplayF(void);


void setupRC(void);


#endif



main.c

#include <stdio.h>

#include <GLUT/GLUT.h>

#include "func.h"

void DisplayF(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glFlush();

}

void setupRC(void)

{

glClearColor(0.1, 1.0, 1.0, 1.0);

}


int main (int argc, char * argv[])

{


// insert code here...

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);

glutCreateWindow("test");

glutDisplayFunc(DisplayF);

setupRC();

glutMainLoop();

return 0;

}



现在程序正常工作了,并且源代码中没有一个警告。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics