C++:警告:有符号和无符号表达式(Gmake,freebsd)

C++: warning: Signed and unsigned expression ( Gmake, freebsd )

本文关键字:Gmake freebsd 表达式 无符号 警告 符号 C++      更新时间:2023-10-16

我遇到一个小问题,希望你能帮助我。谢谢。

这是错误代码:

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

这是我放在pastebin上的代码,因为它太大了,不能放在论坛上FILE.CPP

转到第223行,您有:

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

如您所见,i的类型为int,但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++)

请检查另一个问题:什么时候使用无符号值而不是有符号值?

正是警告所说的内容。您正在比较有符号整数和无符号整数。例如:

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

解决方案是

  1. 使所有变量的类型相同
  2. 无视警告
  3. 抑制它
  4. 使用较低的错误报告级别进行编译,因此根本不生成它

在循环中,i是整数,其中m_vecDragonsSoulNames.size()的类型为无符号整数。使i无符号int