我正在尝试修复其他人编写的模块的 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/