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;
}
现在程序正常工作了,并且源代码中没有一个警告。