当前位置: 首页 > 科技观察

函数体中定义局部变量的问题

时间:2023-03-15 14:50:02 科技观察

有读者提出这样的问题:我把IAREWARM中的一个函数拷贝到KeilMDK-ARM中后,出现编译错误?为什么在EWARM中可以编译,而在MDK-ARM中会出什么问题?1.变量在函数中的定义位置。我们先看看代码中变量a、b、c、d定义的位置:voidTest(void){chara;//a定义的位置printf("a=%d\n",a);charb;//b定义的位置printf("b=%d\n",b);for(charc=0;c<10;c++)//c定义的位置{chard;printf("c=%d\n",c);printf("d=%d\n",d);}}上面的变量定义了位置,相信很多人都见过,有的朋友在实际编程中,就是通常定义在这些位置。上面的代码会不会被C编译器编译错?答:按照C89标准编译会报错;按照C99标准编译不会出错。2.变量定义位置的区别相信很多朋友在大学里学过C和C++,学过C++的朋友都知道上面代码中变量定义的位置是很合理的。但是不知道大家知不知道C89和C99的区别。还是有很多不同的。这篇文章,我们来谈谈变量位置的区别。C89标准不允许在函数的任何地方声明变量。C语言中的变量声明不能放在任何可执行语句之后,只能放在函数(可执行语句)的开头。和上一段代码一样,需要在语句[printf("a=%d\n",a);]之前。C99和C++放宽了限制,允许在函数体的任何地方声明变量。新的C99标准满足了在函数体中定义变量并立即使用的功能。但是,还要注意变量的范围。以下代码会报错:voidTest(void){for(charc=0;c<10;c++){printf("c=%d\n",c);}printf("c=%d\n",c);//这里有问题}3.C99在MDK-ARM和EWARM中的配置上面提到的问题出在IDE的配置上。EWARM工程默认支持C99标准,MDK-ARM工程默认不支持C99标准。因此,如果将支持C99标准的代码拷贝到不支持C99标准的环境中,编译会因为代码的原因而出错。MDK-ARM和EWARM只需要修改配置即可支持C99标准。(1)MDK-ARM配置Project->OptionsforTarget->C/C++勾选“C99Mode”。(2)EWARM配置Project->Options->C/C++Compiler->Language1选择“C99”。关于变量定义的位置也有很多争议:有人说为了兼容C89标准,都写在可执行语句的前面;有人喜欢后面的C99标准,你怎么看?