嵌入式編程別忽略了C語言的標準

嵌入式胖胖 發佈 2022-12-06T06:42:40.173892+00:00

最近做代碼評審發現很多同事的編碼都遊走在風險的邊沿,其中最顯眼的就是局部變量定義位置比較隨意。對於C語言編程老手而言,絕大部分都已經養成了"變量定義必放在語句塊的開頭"這一習慣,依稀還記得那時候學校老師在課堂上強調C語言的局部變量一定要放在函數的開頭。

最近做代碼評審發現很多同事的編碼都遊走在風險的邊沿,其中最顯眼的就是局部變量定義位置比較隨意。

對於C語言編程老手而言,絕大部分都已經養成了"變量定義必放在語句塊的開頭"這一習慣,依稀還記得那時候學校老師在課堂上強調C語言的局部變量一定要放在函數的開頭。

void Function(void)
{
    int Var1 = 0;
    int Var2 = 0;
    //do someting......

}

剛開始學習C語言的時候,感覺也沒啥好解釋的,照著書上和老師的"規矩"來就可以了,後來又學習了C++,C++對這一塊相對就比較靈活,注意一下作用域,隨時定義隨時用,不需要遵循變量定義必須放在函數開頭這一規則。

void Function(void)
{
    int Var1 = 0;
    //do someting......
    int Var2 = 0;
    //do someting......

}

直到很久很久以前有一次看到別人的C程序也可以像C++這樣靈活的定義變量,才認識到C語言還有不同的標準,也是從那以後開始了解C語言的標準。

所謂"無規矩、不成方圓",不同的編譯器會根據不同的標準引入相關的"規矩"來約束和指導編程人員進行程序設計。

C語言作為嵌入式領域主力的程式語言,自然也應該不斷的修正和優化,那得有專門的人來做這些事 -- C語言標準化委員會,目前編譯器主要參考的有三個標準:

C89(C90)

1989年批准、1990年發布(ISO/IEC 9899: 1990 )

C99

1999年發布(ISO/IEC 9899: 1999)

C11

2011年發布(ISO/IEC 9899: 2011)

當然啦,據了解目前的標準都已經更新到了C17,但具體哪些編譯器對其進行了支持,那又是另外一個故事了。

編譯器為了滿足不同開發者的需求,以及新舊代碼工程的兼容,都會把C語言標準的相關選擇放開到編譯選項中,開發人員根據自身需求進行選擇編譯自己的工程源碼,我們來看看,比如:

IAR編譯器中:

嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和內容,導致工資要不上去!

無償分享大家一個資料包,差不多150多G。裡面學習內容、面經、項目都比較新也比較全!某魚上買估計至少要好幾十。

點擊這裡找小助理0元領取:加微信領取資料




GCC編譯器中:

GCC提供了一些C程序編譯的擴展選項,使用-std來進行設置,比如編譯的時候選擇-std=gnu99,對應著GUN對C99的的一些擴展。

特別在進行代碼的移植等等方面,對於當前手頭工具所遵循的C標準還是要心裡有數的,不然一大堆編譯錯誤,夠你折騰的。

前面bug菌聊到,雖然C語言標準是在不斷的更新,然而編譯器卻不一定同步支持,縱觀大部分嵌入式編譯器絕大多數還停留在最高僅支持C99的標準,甚至還不一定全面支持該標準。

個人覺得主要的原因還是對於相關的標準實現起來比較繁瑣,同時在相關領域使用的頻率實在是太低,所以沒有得到全面支持,當然了,有一些編譯器為了更好的客戶體驗,還會加入自身的一些特殊擴展。

那麼bug菌這裡簡單羅列了一下相對於C89標準,C99標準所新增的一些常用的標準項目:
1、預處理,行注釋"//"的支持;

2、inline內聯關鍵字,內聯函數的支持;

3、變量聲明不必放在語句塊的開頭,這也是前面提到的,支持該特性以後for循環常用的一種方式是:for(int i=0;i<100;i++) ;

4、對數組的增強,可變長數組;

5、加入了__func__預定義標識符;

6、不再支持隱式返回,有返回值比如return;

7、對整形提升的修改,其級別低於int或unsignedint的任何整數類型均可被替換成int或unsignedint類型。

還有特別多吧,這裡沒辦法一一列舉了,感興趣的朋友可以去參考下C99標準的文檔。

最後

好了,今天就跟大家分享這麼多了,如果你覺得有所收穫,一定記得點個~


原文連結:https://mp.weixin.qq.com/s/u5G57EGCUyakyJCWWe8_Mg

轉載自:最後一個bug

原文連結:嵌入式編程別忽略了C語言的標準

本文來源網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯繫我進行刪除。

關鍵字: