一、error: 'for' loop initial declarations are only allowed in C99 mode
前段时间写了一个小C程序,放在linux下用gcc编译出错,弹出以下错误:
百度后才知道,是gcc的模式问题。
我在for循环里习惯直接定义并初始化变量来使用:
for(int i=0;i<length; i++)
而在gcc编译时是错误的,应该在循环外定义变量:
int i;
for(i = 0; i<length; i++)
这样才编译通过。
这是因为gcc基于c89标准,换成C99标准就可以在for循环内定义i变量了。
如果一定要在for循环语句里定义并初始化,可以将文件按照下面的方式编译就会通过了:
gcc src.c -std=c99 -o src
二、gcc编译C文件
常用编译命令选项
假设源程序文件名为test.c。
1. 无选项编译链接
用法:#gcc test.c
作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。
2. 选项 -o
用法:#gcc test.c -o test
作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。
3. 选项 -E
用法:#gcc -E test.c -o test.i
作用:将test.c预处理输出test.i文件。
4. 选项 -S
用法:#gcc -S test.i
作用:将预处理输出文件test.i汇编成test.s文件。
5. 选项 -c
用法:#gcc -c test.s
作用:将汇编输出文件test.s编译输出test.o文件。
6. 无选项链接
用法:#gcc test.o -o test
作用:将编译输出文件test.o链接成最终可执行文件test。
7. 选项-O
用法:#gcc -O1 test.c -o test
作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。
多源文件的编译方法
如果有多个源文件,基本上有两种编译方法:
假设有两个源文件为a.c和b.c,b.h,在a.c文件里调用b.c的函数
1. 多个文件一起编译
用法:#gcc b.c a.c -o a
作用:将testfun.c和test.c分别编译后链接成test可执行文件。
2. 分别编译各个源文件,之后对编译后输出的目标文件链接。
用法:
#gcc -c b.c //将b.c编译成b.o
#gcc -c a.c //将a.c编译成a.o
#gcc -o b.o a.o -o a //将b.o和a.o链接成a
以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。
3. 如果要编译的文件都在同一个目录下,可以用通配符gcc *.c -o 来进行编译。
如果是有成千上万的项目文件,可以把上述的编译过程写进以下一个文本文件中:
Linux下称之为makefile
感谢各位网友的分享,仅作总结学习。