【问题标题】:Why do I have to cast an enum element when assigning it to a same enum variable type in C?为什么在 C 中将枚举元素分配给相同的枚举变量类型时必须强制转换它?
【发布时间】:2015-07-30 16:50:56
【问题描述】:

我有以下几点:

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

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

问候。

【问题讨论】:

  • 正如@Veriloud 建议的那样,这似乎是工具错误,而不是代码违规

标签: casting enums compiler-errors misra


【解决方案1】:

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

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

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

很遗憾,许多工具没有正确实现规则和类型模型。在这种情况下,您的工具不正确,这并不违反基本类型规则,因为 ProgramStatusFLS_PROG_SUCCESS 都是相同的基本类型。事实上,标准本身中也显示了一个类似的示例,位于规则的合规示例列表下:

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

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

【讨论】:

  • 非常感谢。这就是我的想法,但我不确定。因为我是 MISRA-C 规则的新手,所以我认为可能确实出了点问题。此外,我认为我的工具也存在其他规则问题,因为这样的事情让我很难过。你能看看他的另一个问题吗,我会非常感激的。 stackoverflow.com/questions/31726911/…
  • 不客气-我想我可以对自己的答案发表评论;-),我看了另一个问题并回答了。介意我问这是什么工具?由于规则 10.3 是一条宽泛的规则,因此该工具应更明确地说明它认为违反了规则的哪一部分。
  • 工具是“TriCore Eclipse IDE v5.0r2”
猜你喜欢
  • 2014-09-20
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2013-06-01
相关资源
最近更新 更多