问题描述:
1、在编译工程时,报错:
error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode
for (U08 i = 0; i < len; i++)
即只有在C99或C11模式下,才能在for循环中初始化变量;
2、编译器给出的建议:
note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
3、在Makefile中加入编译选项-std=c99,重新编译后报错:
error: storage size of ‘tz’ isn’t known
struct timezone tz;
即编译器不知道该结构体变量的存储空间大小;struct timezone结构体是在linux/time.h中定义的,且头文件也包含无误;
4、网上查找资料后,找到了原因:
编译器在处理的时候,如果你指定了–ansi或者-std=c99的指令后,编译器会认为你要是编译一个标准的C程序,那么就在编译时(准确的来说是预处理阶段)将你不符合C标准的地方舍弃掉。怎么舍弃呢?当然是通过宏了。
5、相关说明
–ansi指定使用古老的标准ansiC标准编译,-std=c99则指定使用新的C99标准编译,而gnu99 和gnu9x 则是gcc编译器对C99标准自己的实现
这些的关系是什么呢,
首先标准委员会指定了语言的标准,也就是ansi和后来的C88,C99标准
但是只有标准怎么行,必须有编译器来支持啊,于是各个编译器都开始逐步支持新的标准,同时也就是出现了-std=c89,-stdc99,为了兼容之前的程序,而保留旧的标准–ansi
但是对标准的支持,不可能一下子,只实现了一部分,慢慢再进行扩展,另外由于标准中某些地方可能并不实用,可能需要一些扩展,于是出现了-std=gnu99,现在很多编译器对C的语法都有一些不同的扩展,而这些扩展有些已经加入了新的标准中,有些并未加入或者正在议案加入。
————————————————
解决
解决方法1:
就是我们在编译的过程中编译器的类型,比如-std=gnu99
解决方法2:
显示添加结构体所在的头文件
**
说明:
**
本文在撰写过程中,参考了以下链接中的内容,特此说明:
原文链接:https://blog.csdn.net/gatieme/article/details/50991903