为什么我必须强制转换枚举元素,当它在C中分配给相同的枚举变量类型



我有以下内容:

typedef enum
{
   FLS_PROG_SUCCESS,
   FLS_PROG_FAIL,
   FLS_ERASE_SUCCESS2U,
   FLS_ERASE_FAIL,
   FLS_READ_SUCCESS,
   FLS_READ_FAIL,
   FLS_FORMAT_SUCCESS,
   FLS_FORMAT_FAIL
}FLS_JobResult_t;
void Foo(void)
{
   FLS_JobResult_t ProgramStatus;
   /* Then I try to initialize the variable value */
   ProgramStatus = FLS_PROG_SUCCESS;
   ...
}

没有问题,但是当编译MISRA时,C给出了错误:

表达式的值不能赋给具有较窄基本类型或不同基本类型类别的对象

我发现我应该这样写初始化:

ProgramStatus = (FLS_JobResult_t)FLS_PROG_SUCCESS;

这对我来说不太好,就像MISRA想让我在所有的代码中进行强制类型转换,这太多了。

你知道为什么吗?我不认为这应该是一个问题,但我已经尝试了我想到的所有方法,这是摆脱这个错误的唯一方法,但它根本没有任何意义,不是吗?

问候。

(嗨,这是一个新帐户,所以我还不能使用评论部分要求进一步澄清,所以,我的回答可能比需要的更广泛)

根据警告消息的文本,我假设您谈论的是MISRA-C:2012(最新标准),这是对先前标准的巨大改进,因为在陈述基本原理方面付出了更多努力,并添加了更多兼容和不兼容的示例。这是规则10.3,其基本原理是:由于C允许自动执行不同算术类型之间的赋值,因此使用这些隐式转换可能导致意想不到的结果,可能会丢失值、符号或精度。

因此MISRA-C:2012要求使用更强的类型,正如其基本类型模型所强制的那样,这减少了发生这些问题的可能性。

不幸的是,许多工具没有正确地实现规则和类型模型。在这种情况下,您的工具是不正确的,这并没有违反基本类型规则,因为ProgramStatusFLS_PROG_SUCCESS都是相同的基本类型。事实上,在标准本身中,在规则的兼容示例列表中显示了一个类似的示例:
enum enuma { A1, A2, A3   } ena;
ena  = A1;

如果您的工具供应商不同意,您可以在"官方"MISRA论坛上发布您的问题,以获得官方答案,并将其转发给供应商。

最新更新