2012-12-06 30 views
10

可能重複:
g++ -Wall not warning about double-> int cast克++警告當雙/浮子被轉換成無符號的整數,而無需使用-Wconversion

每問題here,直接轉換從雙/浮子無符號整數不便攜式。我發現在我的代碼中發生了這種情況,並且我想告訴g ++如果發生這種情況會發出警告,但是我找不到這樣的選項。有誰知道是否有這樣做的選擇?

注意:我確實看到了Wconversion,但是它也會警告我不關心的其他所有類型的轉換(如將int轉換爲無符號整數,這對於標準是可移植的)。

編輯:這是我想爲它看到一個警告,一個代碼示例:

double dblNumber = -234; 
unsigned long uintNumber = dblNumber; 

在G ++的一個版本,這給了我0xFFFFFF16(這是-234 2的補數)的整數值。在另一個它給我0.很明顯,代碼是不明確的,這就是爲什麼它可以被理解爲不可移植。

+0

@djechlin:*「注意:我確實看到了Wconversion,但它也會警告我不關心的其他所有類型的轉換(例如將int轉換爲無符號整數,這對於標準來說是可移植的)。」 *。 – Zeta

+0

我承認我沒有看到其他問題,但並沒有真正解決不使用-WConversion問題。看起來奇怪的是,我並沒有警告這個默認情況,特別是因爲不同版本的g ++反應不同導致某些實現悄然失敗。 – KyleL

+0

@KdawgUD你能展示一段代碼嗎?不知道您如何進行轉換。每當你明確地從一種類型轉換到另一種時,例如'un_signed_int_value =(unsigned int)double_value;'你告訴編譯器*我知道我在做什麼*。所以我不明白爲什麼編譯器會警告這種轉換。事實上,如果有明確的演員陣容,那麼將會禁止任何警告。除非我誤解了你的問題,否則你所問的是不可能的。 –

回答

1

浮到int隱式轉換完成後,和截短的值不能符合目標類型,則該行爲是未定義,因爲你的例子很好地說明它。

如果用g ++提供的唯一工具是-Wconversion,也許你應該讓自己的工具來警告過濾掉,以您的方便(我想到了平時sed的AWKperl的或者它取決於你的系統上這些工具的可用性,也許你可以直接從你的IDE做類似的工作,如果你使用的話)。

您也可以使用gcc的specific pragma directives將轉換檢查限制到特定的文件甚至特定的代碼部分。

任何其他編程方法用於在您的代碼中查明發生有問題的轉換時可能肯定會用於插入明確的轉換,這是您應該瞄準的目標。

4

我知道你說你不想使用-Wconversion但它警告你所關心的問題,並至少用g ++轉換longunsigned long(例如)4.5時不發出警告。對於任何其他情況下,它會警告您執行合法所需轉換的地方,只能投它。您的未來維護者將非常感謝您明確表示已經完成了已知的轉換,而不是從代碼上下文中猜測它是否有意或無意。

+0

我100%同意明確轉換更好。我只是希望找到一種方法來建立我的構建系統,以便如果我錯誤地做了一個隱式雙重到未經簽名的轉換,它不會漏過裂縫並且被忽視。對於我的項目來說,不幸的是,由轉換產生的警告太多而無益。 – KyleL

相關問題