如何隐式转换整数类型?

以下代码在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; } 
  • 为什么逻辑表达式被转换?
  • 什么转换在这里?
  • 当我交换OneMyVariable时,为什么代码会通过MISRA检查?

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

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

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)

我怀疑编译器内部将enums作为unsigned integer处理,只要enum没有负值。