初始化枚举类型期间的 MISRA-C 警告

MISRA-C warning during initialization enum type

我的代码中定义了以下枚举

typedef enum e_gpio_pin
{
    GPIO_PIN_1 = 1,     /*!< pin 1 */
    GPIO_PIN_2,         /*!< pin 2 */
    GPIO_PIN_3,         /*!< pin 3 */
    GPIO_PIN_4,         /*!< pin 4 */
    GPIO_PIN_5,         /*!< pin 5 */
    GPIO_PIN_6,         /*!< pin 6 */
    GPIO_PIN_7,         /*!< pin 7 */
    GPIO_PIN_8,         /*!< pin 8 */
    GPIO_PIN_9,         /*!< pin 9 */
    GPIO_PIN_10,            /*!< pin 10 */
    GPIO_PIN_FIRST = GPIO_PIN_1,    /*!< first pin */
    GPIO_PIN_LAST = GPIO_PIN_10 /*!< last pin */
} T_GPIO_PIN;

现在下一行已经用于初始化变量。

 static const T_GPIO_PIN ioPin = GPIO_PIN_9;

并且我低于警告

An expression value of essential type 'Essentially Enum' is assigned to an object of essential type 'Essentially Enum' comment : MISRA 10.3 (C90-2012 req.)

有人知道我该如何解决这个警告吗?

因为枚举常量 GPIO_PIN_9 属于 T_GPIO_PIN ioPin 它们都具有相同的 "essentially enum" 类型。 MISRA-C:2012 附录 D.5 和 D.6 对此进行了解释。在 MISRA 术语中,您的枚举是 类型为 enum<i> 的命名枚举 (*),其枚举常量属于同一类型。

如果您尝试为枚举分配一些值,这些值是另一种枚举类型的枚举常量,您只会遇到问题。我想该工具可能会混淆,因为您都使用了枚举标记和 typedef,也许它认为 enum e_gpio_pinT_GPIO_PIN ioPin 是不同的枚举类型。

就 MISRA 而言,您的代码没有任何问题。通过向您的工具供应商发布错误报告来解决警告。工具错误的解决方法可能是删除枚举标记。


(*) 见附录 D.5

A named enum type is an enumeration which has a tag or which is used in the definition of any object, function or type;