error: #268: declaration may not appear after executable statement in block

试验原因

看到github上一个第三方的工程不错,下载回来学习一下。
工程是STM32 MDK的工程。
编译时报错如下:

error:  #268: declaration may not appear after executable statement in block

引起错误的代码如下:

void test(const char* utf8, int len, u8 *temp)
{
	   printf("utf8->unicode: \r\n");
       printf("utf8: [");
       // ..\x\y\z.c(56): error:  #29: expected an expression
       // ..\x\x\z.c(55): error:  #20: identifier "k" is undefined
       for (int k = 0; k < len; k++) // error here
       {
              printf("%02x ", utf8[k]);
       }
       printf("]\r\n");
 
        // ..\x\y\z.c(61): error:  #268: declaration may not appear after executable statement in block
       int byteCount = 0; // error here
       int i = 0;
       int j = 0;

经常在linux下写纯C的同学一眼就能看出问题,变量的定义一定要在函数入口处定义才行。
在变量之后,才能写执行语句。

但是这是STM32 MDK工程, github大神写的工程, 怎么会错呢?
唯一的可能是某个配置文件,可能作者没提交,里面可能包含一些能编译过此工程的配置。

为了消除编译错误,当然可以去手工改第三方的工程,将变量定义放到函数入口处。
但是这种类型的错误数量一多,这么改就不好了。
本来就是学习一下参考工程,还要改半天错误,这谁受的了。

其实最简单的方法是修改MDK中的C编译标准, 使用C99即可。这招超简单。
error: #268: declaration may not appear after executable statement in block_第1张图片
再做个试验,看看作者的c99选项存在哪个工程配置文件中,为啥没提交。
将原始工程解压, 作一个副本,将副本改成c99模式, 编译过了,用bc4比较改过的工程和原始工程的区别。
可以看出c99模式选项在USER\Template.uvprojx中,这就是工程主配置文件。
区别如下:
error: #268: declaration may not appear after executable statement in block_第2张图片
用的ARM编译器都一样, 都是V5.06u6
用的F4固件库的包不一样, 我系统中F4固件库版本高些。
可以看出,固件库包的区别,不是编译不过的原因。
error: #268: declaration may not appear after executable statement in block_第3张图片
上图可以看出明显的区别,C99模式的使能。
那知道工程编译不过的原因了,就是作者将编译不过的工程上传到github了,这多不严谨啊,让粉丝们多失望:)

你可能感兴趣的:(#,STM32)