点击Keil的C99解决Keil_C51无法定义局部变量问题以及解决变量不能定义在可执行函数前(User\main.c(22): error: #268: declaration may not a)
点击Keil的C99解决Keil_C51无法定义局部变量问题以及解决变量不能定义在可执行函数前(User\main.c(22): error: #268: declaration may not a)
1.先说重点:
先说一下C99重要的性质:那就是变量可以定义在变量被引用前的任意位置
在C89标准的时候,例如我要写一个for循环的函数
在C99模式下,我们可以写成
for(int i=0;i<10;i++){
//for循环语句
}
也就是可以将变量定义在被引用前的任意位置,但是在C99标准之前,要求函数中的局部变量必须定义在函数的开头。
2、发现问题根源
此前写了一个C51的程序,在函数中定义了一个局部变量,然后怎么都编译不通过,报错显示我定义的变量没有定义,我一开始以为是我其他部分的程序有问题,但是反复找了半天,都没找到,最后无意间看到一个资源描述下面的几行字,试了一下才真正找到原因所在。
因为一个函数里面需要用到for循环,然后我定义一个顺序变量j
,由于此前的经验,我了解到在Keil_C51里面不能在for循环里面定义变量,因此我选择在外面定义变量,但是仍然报错,显示我定义的j
没有定义。
无意间看到一句话
在C++中变量的定义可以在用到的时候再定义,因此可以在for循环里面定义,但是C语言必须在函数体的开头定义变量
我一开始是不信的,这不是扯淡吗,咱也不是刚写C语言,咋不记得有这条破规矩?但是很快就被打脸了,当我把那句uchar j;移到函数开头时,还真编译通过了。。。。
于是我开始查找资料,最后发现问题出在Keil本身上,因为Keil_C51支持的C标准还是20多年前的C89,而C89要求函数中的局部变量必须定义在函数的开头。然后我就去找如何把Keil_C51的C标准给“更新一下”,但是很遗憾,Keil_ARM是可以把编译器的C标准设置为C99的,但是Keil_C51不行。既然没办法改变,那就只能适应一下喽,但是为了之后尽量不踩坑,就想着把类似的坑全部找出来,于是就去网上查找C89标准和Keil_C51编译器使用需要注意的事项,记录了一些资料。
3、注意点
Keil_C51的编译器的C标准也不是完整的C89,因为C89甚至不支持 // 的注释符,所以建议使用的时候可以多找资料,然后多参考那本Keil_C51编译器的用户手册,有问题解决问题,再记录,这样问题肯定是会越来越少的。
4、补充报错使用C99模式解决
在Keil_ARM中有时候也会出现类似问题,而且会报错:User\main.c(22): error: #268: declaration may not appear after executable statement in block,表示变量定义前不能出现可执行语句,这点也是因为Keil默认的编译器是C89,需要在项目管理中设置为C99标准,再次编译,报错即消失。
更多内容可以参考这位博主的文章,强力推荐,这里已经把C99的很多新增特性说清楚了
更多推荐
所有评论(0)