2014-09-30 81 views
1

我面臨一個小問題,我希望你能幫助我。謝謝。C++:警告:有符號和無符號表達式(Gmake,freebsd)

以下是錯誤代碼:

FILE.cpp: In member function 'bool DragonSoulTable::ReadAdditionalApplys()': 
FILE.cpp:223: warning: comparison between signed and unsigned integer expressions 

,這裏是我把引擎收錄的代碼,因爲它太大了,把這些代碼在論壇 FILE.CPP

+0

不過一個音符*爲什麼*生成警告 - 想象中的情況下m_vecDragonSoulNames有一大堆物品在其中;例如超過20億項(假設您的計算機架構上sizeof(size_t)== 4)。在這種情況下,for循環中的比較行爲會有所不同,具體取決於它是將兩個值作爲有符號還是無符號進行比較;在簽名的情況下,m_vecDragonSoulNames可能會被重新解釋爲一個負值(!),這意味着for循環會立即終止而不執行循環體 - 可能不是您期望的行爲。 – 2014-09-30 03:57:23

回答

2

轉到第223行,您有:

for (int i = 0; i < m_vecDragonSoulNames.size(); i++) 

正如你所看到的,iint型的,但確實m_vecDragonSoulNames.size()返回int

事實上,你在代碼中有很多像這樣的比較。

當您比較有符號和無符號類型時,編譯器會給出警告(而不是錯誤),這是因爲這些類型的範圍不同。並且有很好的理由,如果你不小心,結果可能會令人驚訝......

如果你知道它的安全性做出這樣的比較,你可以明確地將其中一個值轉換爲相同類型另一方面,警告將消失。

喜歡的東西:

unsigned int a = someUnisgnedValue; 
int b = someSignedValue; 
if ((unsigned) b < a)  
    //... do something 

或者,你可以使用相同類型的兩種。例如,在你的代碼的行223,你可以這樣做:

for (unsigned int i = 0; i < m_vecDragonSoulNames.size(); i++) 

請檢查該另一個問題:When to use unsigned values over signed ones?

+0

你能否給我正確的語法來替換?我是C++初學者我意識到它不是如何制定語法// 我只是想消失這種警告。 – Reby210 2014-09-30 04:00:12

+0

@ Reby210看到編輯,最後的選擇可能對您很方便。但是你應該更多地研究這個話題。 – JosEduSol 2014-09-30 04:05:54

+0

感謝JosEdu,它的工作原理。 – Reby210 2014-09-30 04:28:21

1

警告說,究竟是什麼。您正在比較有符號和無符號整數。例如:

uint NUM = 5; 

for (int i=0; i < NUM; i++) // Here you compare int and uint 

的解決方案是

  1. 讓所有的變量類型相同,
  2. 無視警告的
  3. 壓制它
  4. 較低的錯誤報告級別編譯因此根本不會生成它。
1

在此循環中,我是整數,其中m_vecDragonSoulNames.size()是無符號整數類型。讓我無符號整數

相關問題