大約半年前,寫了篇關於gcc編譯警告的文章《gcc較高版本的一些編譯警告收集》,因為忍受不了當時做的專案的刷屏式的編譯警告。沒想到,現在又要進行此事。因為當前的**分支實在太多,而且又各自為政,沒法通用——與當初重構的初衷已背離,當然,這是架構師要做的事,即使公司現在正在推行「匠心精神」,我還是沒權力和能力想去推架構。所以,注定是乙個修正幾年前**遺留warning的小弟。在修正過程中,真正認為到**編寫的重要性。這份龐大的**我只貢獻不到2%吧,但還是好好總結一下,以免自己日後再犯。
在寫之前,實然想到乙個未定義行為的語句事件,它就是年初遇到的問題,當時曲線解決的,在文章《遇到乙個gcc編譯器版本導致的執行結果有差異的問題》中提到。這個事件實質是對同一變數在同一語句中進行2次操作造成的,類似於大學試卷喜歡出的i = i+++i++這種。幸好,修改警告後,在裝置上驗證的結果和原來的一致,如果不一致,涉及到上位機的修改,那就更麻煩了。
1、除錯語句的警告
警告:
warning: value computed is not used
出錯示例**:
#define ll_debug printf("[%s-%s:%d]", __file__,__function__, __line__) && printf//level_print("[%s:%d]", __file__, __line__) && level_print
問題出現在&&上。其實**意圖很簡單,就是列印資訊同時把行號、函式列印出來。可能因為行碼太過匆忙,就出現上述這樣的**了。修改很簡單,如下:
#define ll_debug(fmt, ...) printf("[%s-%s:%d]" fmt, __file__,__function__, __line__, ##__va_args__)
瞬間人感覺正常了。
同時是除錯語句,警告如下:
warning: statement has no effect [-wunused-value]
出錯示例**:
#if 0
#define ll_debug printf
#else
#define ll_debug
#endif
這樣的語句肯定不行的。修正:
#if 0
#define ll_debug(fmt, ...) printf(fmt, ##__va_args__)
#else
#define ll_debug(fmt, ...)
#endif
2、型別匹配
警告:
warning: format '%d' expects type 'int*', but argument 6 has type 'unsigned short*'
short: %hd
unsigned short: %hu
unsigned int: %u
unsigned long long: %llu
3、變數未初始化
警告:
warning: 'mode' may be used uninitialized in this function
原因是mode在宣告時沒有初始化,但後面有條件地被賦值,不滿足所有情況,編譯器報警告。
比如:
int mode;
if (idx > 1)
int set = mode;
假如idx小於1,mode就不會被賦值,set的值就是未知的了(看編譯器)。
4、其它
警告:
warning: backslash and newline separated by space
巨集後面使用「\」來連線多行,但「\」後面多了空格,刪除空格即可。
警告:
warning: "/*" within comment [-wcomment]
在「/***/」中還有「/*」,有這個警告,我會認為寫**的人細心度不夠,寫**如行雲流水。呵呵。
總結:幹一行愛一行,既然選擇乙個寫**的人,就認真對待吧。不為他人,為的是現在的你不讓以後的你掉坑。(可惜我一直在坑里)
李遲 2015.10.20 周二 晚上
讓編譯器對一些警告閉嘴
1 方法啟用告警 pragma clang diagnostic push pragma clang diagnostic ignored wdeprecated declarations code這裡插入相關的 pragma clang diagnostic pop 2.不相容指標型別 pragm...
gcc支援編譯的一些原始檔
gcc gnu ccompiler 是gnu推出的功能強大 效能優越的多平台編譯器,gcc編譯器能將c c 語言源程式 匯程式化序和目標程式編譯 連線成可執行檔案,以下是gcc支援編譯的一些原始檔的字尾及其解釋 c為字尾的檔案,c語言源 檔案 a為字尾的檔案,是由目標檔案構成的檔案庫檔案 c,cc或...
gcc一些命令
檢視版本用 v 預處理 gcc e hello.c o hello.i o是指生成的檔案叫什麼,這裡是叫hello.i gcc一部生成目標檔案 gcc c hello.c o hello.o gcc生成可執行程式 鏈結 gcc hello.0 o hello 用來注釋很方便 if 0或1 以 end...