c - 运算符 '++' 的未经允许的操作数 [MISRA 2012 规则 10.1,必需]

标签 c enums misra pc-lint

我正在尝试修复其他人编写的模块的 Misra 警告。我观察到 ++ 操作正在 enum 上使用。

我提到了 SE question谈论同一个话题。我该如何解决这个错误?我是否需要建议模块所有者更改实现?

#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;
}

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

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

最佳答案

增加枚举是错误的!

枚举被添加到语言中作为许多常量的#define 的更好替代,并且在其他方​​面被认为是整数(即整数的常量数组)。要强制执行更多内容,需要运行时检查。

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

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

如果你想在由连续整数表示的特定状态范围内循环,你可以使用枚举,但前提是你使它的值也连续。对解释解释不要修补的定义提出很多警告。然后递增表示状态的 int,然后可以安全地将其与枚举进行比较。

关于c - 运算符 '++' 的未经允许的操作数 [MISRA 2012 规则 10.1,必需],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57868745/

相关文章:

c - 获取Linux内核模块中的接口(interface)网络掩码

C - 如何将数组中的任意组合 char 或 int 连接到 int 或 char 类型的二进制字符串

java - 如何在子句行为中自定义 NamedParameterJdbcTemplate?

c - MISRA:有符号整数的按位运算

python - 从网页中抓取文本

c - 是否可以在链接期间触发#warning?

java - 将枚举实例引用为该类型的另一个实例的字段是否合法?

创建一个接受枚举变量并返回字符串指针的函数

c - 如何解决有关对基础类型应用按位运算符 ~ 和 << 的 Misra 警告

c - MISRA 2012 规则 8.10 静态内联