2012-12-19 88 views
0

我決定使用MinGW構建的項目的編譯器設置。看來海灣合作委員會有一套非常龐大的控制警告的選項。用於GCC警告選項的用例-Wno-sign-compare,-Wno-type-limits和-Wno-logical-op

但我不明白的是爲什麼提供一個選項來禁用一些危險的警告,並且幾乎不會造成任何滋擾。

-Wno-sign-compare的:禁用,警告時,當符號值轉換爲無符號 符號和無符號值之間的比較會產生不正確結果而進行警告。

-Wno型限制:禁用,警告如果比較是永遠爲真或假,由於數據類型的限制範圍的警告,但不警告爲常量表達式

- Wno-logical-op:禁用在表達式中警告可能使用邏輯運算符的警告。這包括在可能需要按位運算符的上下文中使用邏輯運算符

對於我來說,這些是真正有效的警告,我無法想象可以禁用它們的用例。我會很高興,如果我能得到一些使用這種警告並不嚴重的用例,並修復它們使代碼更改很困難。

回答

1

自從幾天前,我會完全同意。然而,至少在-Wno型限制我現在知道用例:

如果選中一個枚舉值是有效範圍內的真正組成部分,有時構建這樣發生:

/* Check if the Input Error is within range */ 
    if ((ErrorId >= (CS_ErrHdl_ErrorId_t)0) && (ErrorId < CS_ErrHdl_ErrId_EndOfList)) 
    { 
    ... 
    } 

其中CS_ErrHdl_ErrorId_t是一個枚舉類型,ErrorId是該枚舉類型。

作爲標準枚舉(沒有給出明確的值)總是從0開始,總是有警告:

比較永遠爲真,由於數據類型範圍限制[-Wtype-限制]

在這種情況下,它有助於關閉該警告,因爲它會污染所有編譯器輸出。

(當然有人會說這個比較是有用的,但公司經常使用的。)

乾杯, 菲利克斯

0

我有哪裏clock_t是無符號的環境(ARM mbed OS)。但C標準庫說,clock()應該在失敗時返回-1,所以我有一個檢查然後性質:if(clock() < 0)。由於clock()無法返回負整數,因此會拋出-Wtype-limits。

對我來說,更改我的代碼以匹配不符合的環境可能很容易,但由於沒有負面影響,我寧願寫出正確的可移植代碼並在此環境中禁用警告。