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,然后可以将其安全地与枚举进行比较。