编译期间出现警告

时间:2015-01-08 12:10:41

标签: c optimization

警告来自以下给定的代码集,该警告会在编译代码期间产生影响。这里有3组代码在所有代码中给出,警告即将到来。

首先:

unsigned long Get_TestVal(unsigned int B_Index) 
{
     unsigned long val = 0;
     if((B_Index >= 0) && (B_Index < 16)) // condition is always true: warning came 
           val = 1;
     else if((B_Index >= 16) && (B_Index < 32))
         val = 2;
    .....
    return (val);
}

第二

for(i =0 ; i < 2; i++)
{
    if((Buffer[i] >= 0)  && (Buffer[i]<= 9) ) // condition is always true: warning came 
    {
            Buffer[i] = Buffer[i] + 48;
    }
}

第三:

 if(val < 0)// condition is always false :warning came
    {
        flag = HMP_LO;                      
    }

4 个答案:

答案 0 :(得分:2)

由于B_Indexval都属于unsigned long类型,因此它们(根据定义)永远不会小于零(即负数)。这是警告告诉你的第一个和最后一个案例。

您没有显示Buffer的声明,因此很难提供帮助。

答案 1 :(得分:2)

请检查B_Index的数据类型。它说unsigned int始终保证>= 0的值[即使在溢出之后]。这就是代码if((B_Index >= 0)...的警告。

unsigned long val相同,if(val < 0)始终 FALSE

最后,我认为我们可以安全假设,如果if((Buffer[i] >= 0)Buffer属于unsigned数据类型,则警告背后的原因相同作为第一个案例。

解决方案: 您可以安全地删除这些特定条件检查。

答案 2 :(得分:0)

在第一个示例中,B_Index的类型为unsigned int,因此B_Index始终大于或等于0.

在第二个和第三个示例中,您没有为Buffer[i]val指定类型,但我认为类似的条件成立。

答案 3 :(得分:0)

1)警告由条件B_Index >= 0生成,只要您使用unsigned,就可以安全地将其删除。

2)在这里,假设Buffer是类似于unsigned的数组,警告由条件Buffer[i] >= 0生成,只要您使用unsigned,就可以安全地删除它}。

3)这里的原则相同。警告由val < 0生成,如果您预计不应使用负数unsigned

额外)您应该针对unsigned文字进行测试,例如:index == 1u。最后的u告诉编译器文字应该是unsigned

相关问题