最近做代碼評審發現很多同事的編碼都遊走在風險的邊沿,其中最顯眼的就是局部變量定義位置比較隨意。
對於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語言的標準
本文來源網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯繫我進行刪除。