为什么在 C 中将枚举元素分配给相同的枚举变量类型时必须对其进行强制转换?

2024-01-02

我有以下内容:

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 希望我在所有代码中进行强制转换,这太过分了。

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

Regards.


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

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

因此,MISRA-C:2012 要求使用更强的类型,如其基本类型模型所强制执行的那样,从而降低发生这些问题的可能性。

不幸的是,许多工具没有正确实现规则和类型模型。在这种情况下,您的工具不正确,这并不违反基本类型规则,因为ProgramStatus and FLS_PROG_SUCCESS两者都是相同的基本类型。事实上,标准本身在规则的合规示例列表下显示了类似的示例:

enum enuma { A1, A2, A3   } ena;
ena  = A1;

如果您的工具供应商不同意,您可以将您的问题发布到“官方”MISRA 论坛 http://misra.org.uk/forum/获取官方答复并将其转发给供应商。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 C 中将枚举元素分配给相同的枚举变量类型时必须对其进行强制转换? 的相关文章

随机推荐