繼續收集gcc一些編譯警告

2021-07-06 00:14:49 字數 2216 閱讀 8408

大約半年前,寫了篇關於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...