前面有小伙伴问了这样一个问题:
我将ewiar中的一个函数拷贝到mdk-arm中之后,发现编译出错了。为什么在ewarm中可以编译通过,但在mdk-arm中会出错呢?
我一看代码,基本上判断问题大概出在什么位置。经过进一步分析得出错误原因:就是函数里面局部变量定义的位置不对导致的错误。
针对上面的问题,这个问题大家可能在实际项目中不常见,但牵涉的知识也有必要向大家分享。
ⅰ
函数中变量的定义位置
大家先看下代码中变量a、b、c、d定义的位置:
void test(void)
{
char a;
printf(a = %d\n, a);
char b;
printf(b = %d\n, b);
for(char c = 0;c < 10; c++)
{
char d;
printf(c = %d\n, c);
printf(d = %d\n, d);
}
}
以上变量定义位置,相信很多人都看到过,有些朋友在实际编程中也常这么定义在这些位置。
上面这段代码c编译器编译会错吗?
答案:按照c89标准编译就会出错;按照c99标准编译就不会出错。
ⅱ
变量定义位置的区别
相信很多朋友在大学的时候都学过c和c++,学过c++的朋友都知道,上面那段代码变量定义的位置是很合理的。
但不知道大家了解过c89和c99的区别,区别的内容还是有很多,针对本文说下定义变量位置的区别。
c89标准是不允许在函数中随便位置声明变量,c语言中的变量声明不能放在任何可执行语句之后,只允许在函数(可执行语句)的开始处。如上一段代码,需要在【printf(a = %d\n, a);】这条语句之前。
c99及c++放松了限制,允许在函数体内任意位置声明变量。c99新的标准满足了在函数体内定义变量立马就使用的功能。但是,也要注意变量的作用域。如下面代码,红色的语句就会出错。
void test(void)
{
for(char c = 0; c options for target -> c/c++ 勾选上“c99 mode”即可。
2.ewarm的配置
project -> options -> c/c++ compiler -> language 1 选中上“c99”即可。
关于变量定义的位置也有很多争议:有的人说为了兼容c89标准,都统一写在可执行语句前面;有的人则喜欢后面c99标准规定的,这种比较随性,随定随用。我也没有什么好的建议,看个人吧。
区块链技术到底可以做些什么
三星公布Galaxy S10 Lite和Note 10 Lite 最低起售价为599欧元
74ls148价格和74ls148管脚图与工作原理
广汽丰田iA5的电池系统设计解析
人脸识别一体机在互联网领域热门的技术
关于 函数体内局部变量定义的位置
探讨一下机器视觉的这些趋势话题
移动、电信、联通纷纷发布5G重大战略以及最新动态
电线中的铜芯和铝芯为何不能直接对接
OLED蒸镀机有多难造,如今我国已经成功实现量产
疫情时期,为自动驾驶行业带来全新的机遇
5G + 车载处理器+ 云端——新时代汽车的正确组合方式
华为对外投资案例分析 华为对外投资的公司增加宁波润华全芯微电子
特斯拉车身BCM控制信号解码匹配与CAN报文数据采集及应用分析
一文解读LoRa通信技术
哪些产能会受B2011排针灼热料连接器的影响?
小米CC9 Pro即将发布该机搭载1亿像素五颗摄像头
同一个CPU核访问不同的内存条延时一样吗?
曝高通2亿像素传感器将于明年正式推出
T3S系列mesh自组网电台在无人机的应用