3

我无法正确编译一些代码。这是我的错误:

警告 C4018:“>=”:有符号/无符号不匹配

void Player::HasteCap()
{
    if (sWorld->getBoolConfig(CONFIG_PLAYER_HASTECAP_ENABLE))
        return;

    bool hasInstantHasteCap = (GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 0) == 1 
                            || GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 1) == 1 
                            || GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 2) == 1 
                            || GetFloatValue(UNIT_MOD_CAST_SPEED) == 0);

    if (m_baseRatingValue[CR_HASTE_MELEE] > sWorld->getIntConfig(CONFIG_PLAYER_HASTECAP_LIMIT))
    {
        SetFloatValue(UNIT_MOD_CAST_SPEED, 0);
        SetFloatValue(UNIT_FIELD_BASEATTACKTIME + BASE_ATTACK, 1);
        SetFloatValue(UNIT_FIELD_BASEATTACKTIME + OFF_ATTACK, 1);
        SetFloatValue(UNIT_FIELD_BASEATTACKTIME + RANGED_ATTACK, 1);
    }

    else if (hasInstantHasteCap && m_baseRatingValue[CR_HASTE_MELEE] < sWorld->getIntConfig(CONFIG_PLAYER_HASTECAP_LIMIT))
    {
        SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f);
        SetRegularAttackTime();
        ApplyCastTimePercentMod(m_baseRatingValue[CR_HASTE_SPELL] * GetRatingMultiplier(CR_HASTE_SPELL), true);

        if (GetShapeshiftForm())
        {
            SpellShapeshiftEntry const* ssEntry = sSpellShapeshiftStore.LookupEntry(GetShapeshiftForm());
            if (ssEntry && ssEntry->attackSpeed)
            {
                SetAttackTime(BASE_ATTACK, ssEntry->attackSpeed);
                SetAttackTime(OFF_ATTACK, ssEntry->attackSpeed);
                SetAttackTime(RANGED_ATTACK, BASE_ATTACK_TIME);
            }
        }
    }

    if (CanModifyStats())
    {
        UpdateDamagePhysical(BASE_ATTACK);
        UpdateDamagePhysical(OFF_ATTACK);
        UpdateDamagePhysical(RANGED_ATTACK);
    }
}
4

3 回答 3

7

您要比较的两个值的有符号/无符号性质应该相同,否则一个会被转换为另一个进行比较,这可能会导致意外结果。

最好确保您要比较的是同一类型,但是:

如果您知道可以安全地转换哪个值,请显式转换该值。在您的情况下,将有符号值作为无符号值。

例如

unsigned int val1 = someunsignedvalue;  
int val2 = somesignedvalue;    
if (val1 > (unsigned int) val2) {
    /* do stuff */  
}
于 2013-02-25T01:29:01.263 回答
3

这些是警告而不是错误。通常,尽管出现警告,代码仍应编译。但是,如果您指定“将警告视为错误”编译器选项,则如果编译器产生任何警告(或错误),则编译器将不会编译。

要解决该警告,您可以将逻辑运算符的无符号一侧转换为 int。

于 2013-02-25T01:26:53.827 回答
1

您发布的代码不包含相关成员/函数的定义,但编译器可能是正确的。

你期待什么样的答案?

要么解决问题(更改成员/函数/执行 C 样式转换/执行 static_cast<...> 等,以便比较双方的“签名”匹配),或者使用合适的 #pragma 禁用此警告

于 2013-02-25T01:25:45.003 回答