2012-11-27 50 views
1

考慮下面的代碼片斷:爲什麼GCC不會生成分辨率丟失警告?

long long someVar64 = 0LL; 
int someVar32 = someVar64; 

在情況下,它不是很明顯,有在該64位值被分配給一個32位的值,從而產生比特損失這裏有一個潛在錯誤。在這種情況下,這很好,因爲我們不關心0的高位,但如果我改變常數,我可以很容易地創建一個錯誤。

爲什麼GCC(4.4.3)不會爲此代碼生成警告?我記得以前的舊版本。

+3

你嘗試明確啓用此警告'-Wconversion'? –

+0

你沒有指定你用來調用GCC的標誌,但至少你應該使用'-Wall'作爲起點。 –

回答

3

此警告由-Wconversion啓用。請注意,它不是由-Wall或-Wextra啓用的。

-Wconversion

警告上述可能改變的值的隱式轉換。這包括實際與整數之間的轉換 ,如abs (x),其中x是 的兩倍;之間的轉換符號和無符號,就像 unsigned ui = -1;和轉換到更小的類型,如sqrtf (M_PI).

不發出警告的顯式轉換像abs ((int) x)ui = (unsigned) -1, 或者如果該值不被轉換在abs (2.0)變了樣。

[...]

來源:http://gcc.gnu.org/onlinedocs/gcc-4.8.1/gcc/Warning-Options.html#Warning-Options

相關問題