在FreeBSD中使用gcc编译c ++源代码时出现此警告。
有人可以解释并帮助我解决我遇到的问题吗?
以下是整个源代码的链接,它被放置在pastebin上,因为它包含7000行代码。 Source char.cpp
以下是警告信息:
In member function 'void CHARACTER::PointChange(BYTE, int, bool, bool)':
答案 0 :(得分:3)
扩展@KaliG的回答:
在 3065 行,您宣布:
DWORD exp = GetExp();
现在什么是DWORD
?嗯,它代表双字,而这个C ++实现(Win32)上的“字”是16位。它是一个typedef,实际上是无符号整数。
http://en.wikipedia.org/wiki/Word_%28computer_architecture%29
另一个变量,amount是一个定义为(signed)int 类型的参数。
所以你要比较有符号和无符号整数 - 这会导致警告。 您可以通过简单地将金额转换为unsigned int(或“DWORD”)来解决此问题,因为您已经验证它实际上是正数。
所以将行改为:
if (amount < 0 && exp < (DWORD) -amount)
这应该有效 - 但我不知道你的方法是如何运作的。
旁注:匈牙利符号真是可怕的东西 - 所以你应该真正深入研究他们实际使用的不同类型名称。 http://en.wikipedia.org/wiki/Hungarian_notation
旁注2:不要使用ALLCAPS类名...开发人员习惯认为这些标识符是常量,因此您可能会混淆可能会读取您代码的其他人。
旁注3:阅读 2s补充,了解CPU内部的ALU(http://en.wikipedia.org/wiki/Arithmetic_logic_unit)实际在做什么:http://en.wikipedia.org/wiki/Two%27s_complement
答案 1 :(得分:1)
从抛出的错误中,我会说这是因为&#39; exp&#39;是一个未签名或签名的变量,而&#39; amount&#39;是相反的,因此你得到比较错误的原因。
请在声明这些变量的地方张贴代码行。 :)
(验证您是否将这两个变量中的任何一个声明为有符号/无符号。)