将IAR EWARM的一个函数拷贝到Keil里后编译出错了?

有读者问了这样一个问题:我将iar ewarm中的一个函数,拷贝到keil mdk-arm中之后,编译出错了?
为什么在ewarm中可以编译通过,却在mdk-arm中会出错呢?
1
函数中变量的定义位置大家先看下代码中变量a、b、c、d定义的位置:
void test(void){ char a; //a定义的位置 printf(“a = %d
”, a);
char b; //b定义的位置 printf(“b = %d
”, b);
for(char c = 0; c 《 10; c++) //c定义的位置 { char d; printf(“c = %d
”, c); printf(“d = %d
”, d); }}
以上变量定义位置,相信很多人都看到过,有些朋友在实际编程中也常这么定义在这些位置。
上面这段代码c编译器编译会错吗?答案:按照c89标准编译就会出错;按照c99标准编译就不会出错。
2
变量定义位置的区别
相信很多朋友在大学的时候都学过c和c++,学过c++的朋友都知道,上面那段代码变量定义的位置是很合理的。
但不知道大家了解过c89和c99的区别,区别的内容还是有很多,针对本文说下定义变量位置的区别。
c89标准是不允许在函数中随便位置声明变量,c语言中的变量声明不能放在任何可执行语句之后,只允许在函数(可执行语句)的开始处。如上一段代码,需要在【printf(“a = %d ”, a);】这条语句之前。
c99及c++放松了限制,允许在函数体内任意位置声明变量。c99新的标准满足了在函数体内定义变量立马就使用的功能。但是,也要注意变量的作用域。如下面代码就会出错:
void test(void){ for(char c = 0; c 《 10; c++) { printf(“c = %d
”, c); } printf(“c = %d
”, c); //这里有问题}
3
mdk-arm和ewarm中c99的配置上面说的问题,就是出在ide的配置上。ewarm工程默认是支持c99标准的,而mdk-arm工程默认是不支持c99标准的。所以说,将一个支持c99的标准的代码拷贝到不支持c99标准的环境中,编译就会因为代码而出错。
mdk-arm和ewarm只需要修改一下配置就可以支持c99标准。
1.mdk-arm的配置project -》 options for target -》 c/c++ 勾选上“c99 mode”即可。
2.ewarm的配置project -》 options -》 c/c++ compiler -》 language 1 选中上“c99”即可。
关于变量定义的位置也有很多争议:有的人说为了兼容c89标准,都统一写在可执行语句前面;有的人则喜欢后面c99标准规定的,你认为呢?
原文标题:都是局部变量惹的祸
文章出处:【微信公众号:strongerhuang】欢迎添加关注!文章转载请注明出处。


中兴通讯将在非洲地区推出“一个数字化的非洲将全速实现”
黑莓KEY2红色版国行开启预约 售价4499元
三基色多色温LED人工智能路灯亮相重庆市 将助推重庆都市游发展
AI换脸技术在互联网领域的应用场景范围
无线数据采集系统正在网络化、智能化的发展
将IAR EWARM的一个函数拷贝到Keil里后编译出错了?
最大信噪比与时钟抖动的关系
雷达技术为智能家居安全应用助力
5G商用逐渐铺开,5G套餐资费将趋于正常化
怎么看CPU有没有超频 cpu超频的意义是什么
那个拉风的波士顿动力机器狗将走出实验室,走到我们中间!
5种光缆结构怎么选?
京东、苏宁两大平台纷纷对自营iPhone价格进行了下调
手动式的单轴滑动导向结构中使用驱动器实现自动化
云中运行ERP的8种误解你中招了吗
一座 “数智桥梁”,华为助力“天堑变通途”
控制设备维修费用的十大法宝
AMD内测多款RX 6000M移动显卡
比亚迪元,国产小钢炮suv,百公里加速仅需4.9秒,混动版车型油耗仅2L
7805稳压芯片,7805芯片介绍