2010-08-30 88 views
2

編譯我C++代碼我使用-W標誌,這將導致警告:克++警告:無符號表達<0的比較結果爲總是假

警告:無符號表達< 0的比較結果爲總是假

我相信,這被認爲是一個錯誤,被固定在版本的GCC 4.3,但我使用這顯然冒犯這裏GCC 4.1

代碼:

void FieldGroup::generateCreateMessage (const ApiEvent::GroupData &data, omsgstream &result) const { 
    dblog << debug; 

    // Write out the data fields we care about, in the order they were specified 
    for (size_t index = 0; index < fields.size(); ++index) { 
    size_t esIndex = clsToES[index]; 
    if (esIndex < 0 || esIndex >= data.fields.length()) { 
     ostringstream buf; 
     buf << "Invalid field " << index << " (index in ES data set " << esIndex << ", " << data.fields.length() << " fields returned)"; 
     throw InvalidDataException (buf.str()); 
    } 
    fields[index].writeData (data.fields[esIndex], result); 
    } 
} 

警告我越來越:

dbtempl.cpp:在成員函數「void ECONZ :: FIELDGROUP :: generateCreateMessage(常量新西蘭::合作:: econz :: EVENTSERVER :: ApiEvent: :GroupData &,ECONZ :: omsgstream &)常量「: dbtempl.cpp:480:警告:無符號表達< 0的比較總是假

我怎麼可能阻止出現這些警告?我不想刪除-W標誌。

+2

只是一個小小的評論:編譯器可以有錯誤,但這些是非常罕見的。所以當編譯產生警告時,首先檢查你的代碼**,不要認爲它是編譯器的錯誤。 – ereOn 2010-08-30 07:23:26

+0

我的不好。我有點誤解了在這裏找到的gnu bug報告:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23587 – nixgadgets 2010-08-30 07:28:48

+0

有趣的是:如果你比較一個無符號數量和'<0,GCC 4.5.1不會抱怨'在GCC或G ++編譯器中,即使在用'-Wall'進行編輯時也是如此。它要求'-Wextra'現在生成警告。也許你應該從GCC 4.1升級到GCC 4.3或更高版本? – 2010-08-30 07:29:33

回答

16

您正在測試,如果正值低於0

一個size_t無符號,因此至少是0

這可以從未發生,編譯器通過只刪除測試優化的事情了。警告在這裏告訴你,因爲如果有人這樣做,這可能是一個錯誤。

就你而言,你可能只是刪除測試,它應該沒問題。

+0

只是一個評論,因爲它發生在我身上:如果你減去unsigned int,例如'unsigned int a = 3'和'unsigned int b = 4',那麼由於溢出,'a-b <0'將始終爲假。 – ezdazuzena 2013-02-19 09:16:03

2

Renove人物esIndex < 0 ||

這部分代碼是完全沒有意義的機器,這就是爲什麼編譯器會發出警告 - 「你的意思去做別的事?」。

4

size_t是一個無符號整型。因此,編譯器會發現比較< 0將始終爲假(標準確實在發生溢出時指定2的補碼包裝)。你應該進行比較,因爲它是無操作的(編譯器可能不會生成任何代碼)。

無符號整數,聲明無符號,應當服從算術模2n個的規律,其中n爲整數的特定大小的值表示比特的數量 。

和相應的腳註:

46)這意味着,因爲一個 結果不能由 來表示所得到的無符號整數類型是 降低模無符號 算術不會溢出一個 的數字大於 可由結果 無符號整數類型表示的最大值。

0

我該如何阻止這些警告出現?我不想刪除-W標誌。

:| |

只是糾正你的代碼,並警告將消失...這是念頭......

的警告是有幫助你產生正確的,更清潔,更高效的代碼。

+4

可重用代碼如何從客戶端自定義頭文件中繪製* const * size_t值的情況如何?在某些情況下,const值可能被設置爲零(例如,音頻通道的數量),並且意圖是這些循環如果爲零,則簡單地退出編譯。以不會產生編譯器警告的方式編寫它會很好。可以使用預處理宏代替我想... – meowsqueak 2013-04-18 23:03:04

+2

通過定義'static const unsigned ZERO = 0',您可以使用'x YoYoYonnY 2016-10-24 13:41:31

+0

@YoYoYonnY,用clang ++試過。沒有這樣的運氣。但我很有希望。 :) 可以禁用/啓用圍繞比較線的警告,[這裏](http://useyourloaf.com/blog/disabling-clang-compiler-warnings/)。 '#pragma clang diagnostic ignored「-Wtautological-compare」 – NoahR 2016-10-25 14:54:09

相關問題