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即可。這招超簡單。
在這裏插入圖片描述
再做個試驗,看看作者的c99選項存在哪個工程配置文件中,爲啥沒提交。
將原始工程解壓, 作一個副本,將副本改成c99模式, 編譯過了,用bc4比較改過的工程和原始工程的區別。
可以看出c99模式選項在USER\Template.uvprojx中,這就是工程主配置文件。
區別如下:
在這裏插入圖片描述
用的ARM編譯器都一樣, 都是V5.06u6
用的F4固件庫的包不一樣, 我係統中F4固件庫版本高些。
可以看出,固件庫包的區別,不是編譯不過的原因。
在這裏插入圖片描述
上圖可以看出明顯的區別,C99模式的使能。
那知道工程編譯不過的原因了,就是作者將編譯不過的工程上傳到github了,這多不嚴謹啊,讓粉絲們多失望:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章