linux下编译工程提示:storage size of ‘tz’ isn't known

问题描述:

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值