如何隐式转换整数类型?

har*_*per 5 c misra

以下代码在MISRA检查中失败.具体的错误消息是:

(MISRA-C:2004 10.1/R)如果不是转换为相同签名的更宽整数类型,则整数类型表达式的值不应隐式转换为不同的基础类型.

typedef enum _MyEnum { One, Two } MyEnum;
MyEnum MyVariable;

int foo(void)
{
    int result = 1;

    if (One == MyVariable)  // fails here with MISRA-C:2004 10.1/R
    {
        result = 2;
    }    
    return result;
}
Run Code Online (Sandbox Code Playgroud)
  • 为什么逻辑表达式被转换?
  • 什么转换在这里?
  • 为什么代码通过MISRA检查,当我换OneMyVariable

编辑:编译器是TI"MSP430 C/C++编译器v4.0.0",包含MISRA规则检查.

Lun*_*din 6

MISRA检查器中没有错误,它的行为正确.你得到这个错误,因为C标准有缺陷且不合逻辑.

有两个项目:

  • One是一个枚举常量.标准§6.7.2.2/ 2规定,这应与之相容int,无例外.

  • MyVariable枚举类型.标准§6.7.7.2/ 4规定这应该与char,有符号整数类型或无符号整数类型兼容.适用的类型是实现定义的行为.

在您的情况下,实现定义的枚举类型似乎等于unsigned int.

因此代码试图将signed int的变量隐含地转换为unsigned int,这违反了MISRA 2004 10.1.

符合MISRA标准的代码应该是if (One == (MyEnum)MyVariable).

  • "标准"是C标准吗?如果MyVariable是unsigned int,那么当我交换One和MyVariable时,为什么检查会成功? (2认同)

Jes*_*erE -1

我怀疑是编译器错误。你使用什么编译器?这篇文章提到了使用 TI 编译器时导致 Misra 10.1/R 失败的编译器错误。