试验原因
看到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即可。这招超简单。
再做个试验,看看作者的c99选项存在哪个工程配置文件中,为啥没提交。
将原始工程解压, 作一个副本,将副本改成c99模式, 编译过了,用bc4比较改过的工程和原始工程的区别。
可以看出c99模式选项在USER\Template.uvprojx中,这就是工程主配置文件。
区别如下:
用的ARM编译器都一样, 都是V5.06u6
用的F4固件库的包不一样, 我系统中F4固件库版本高些。
可以看出,固件库包的区别,不是编译不过的原因。
上图可以看出明显的区别,C99模式的使能。
那知道工程编译不过的原因了,就是作者将编译不过的工程上传到github了,这多不严谨啊,让粉丝们多失望:)