运算符“ ++”的不允许操作数[MISRA 2012规则10.1,必填]

kap*_*dit 1 c enums misra pc-lint

我正在尝试为其他人编写的模块修复Misra警告。我观察到++正在对进行操作enum

我提到了关于同一主题的SE问题。如何解决此错误?我是否需要建议模块所有者来更改实现?

#include <stdio.h>

typedef enum
{  
    COMPARE = 0,
    INCONSISTENT = 10,
    WRITE,
    READ,
    FINISHED  
}TestsType;

static TestsType CurrentTest;

void fun1(void)
{

    if(READ != CurrentTest)
    {

            CurrentTest++;
    }
    else
    {
            CurrentTest = FINISHED;
    }
}

int main(void) {
    // your code goes here

    CurrentTest = COMPARE;
    fun1();
    printf("%d", CurrentTest);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我将enum这样的代码故意保留在代码中以了解任何影响。但是,在实际代码中,如下所示。

typedef enum
{  
        COMPARE,
        INCONSISTENT,
        WRITE,
        READ,
        FINISHED  
}TestsType;
Run Code Online (Sandbox Code Playgroud)

小智 7

增加一个枚举是错误的!

在常量中,将枚举添加到语言中作为#define的更好替代,并且在其他方​​面也将其视为int(即,int的const数组)。要强制执行其他任何操作,都需要运行时检查。

由于枚举值不必是连续的,因此当将它们视为整数时,将它们递增是没有意义的。如果编译器确实允许它,它会认为它正在增加一个int,这可能意味着您的值此后与枚举中的任何值都不对应。

因此,即使特定的编译器允许您这样做,我的建议还是“不要这样做”。将其重写为明确的内容。

如果要循环显示由连续整数表示的特定状态范围,则可以使用枚举,但前提是必须使其值也连续。在定义上放很多警告,以解释不要修改。然后增加一个表示状态的int,然后可以将其安全地与枚举进行比较。