【发布时间】:2019-09-10 10:21:47
【问题描述】:
我正在尝试修复其他人编写的模块的 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;
【问题讨论】:
-
在发布的代码中
CurrentTest++将产生一个值1,它不是定义的enum值之一。相反,当READ == CurrentTest不需要if .. else。 -
@WeatherVane 我不确定开发人员对此 if 条件的意图。但是在实际代码中,枚举值是按顺序排列的,不会在 0 之后跳转到 10。
-
@kapilddit 有为枚举自定义整数值的正当理由,它用于“实际代码”
-
我需要做些什么来避免这个警告而不影响代码?
-
如果您需要使用 ++,那么您可能不应该选择枚举,而是选择普通整数类型和
#defined常量。如果您知道这些值是连续的,那么它并没有真正的危害,但它不符合 MISRA。