gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:38:40 25 4
gpt4 key购买 nike

我有以下内容:

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;

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

关于casting - 为什么在将枚举元素分配给 C 中的相同枚举变量类型时必须强制转换枚举元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31729670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com