为什么在 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 中将枚举元素分配给相同的枚举变量类型时必须对其进行强制转换? 的相关文章

  • C - '=' 标记之前的预期表达式...在没有 '=' 的行上

    我疯狂地试图找出这个与现实 我的代码没有明显联系的错误消息 我一直在这里搜索并得出一个结论 你会讨厌 typedef 隐藏的指针 抱歉 这超出了我的控制范围 教授以这种方式提供了代码 我正在编辑问题中指定的代码 我弹出完整节点以避免每个推送
  • 在 C 中使用 #if 进行转换

    为什么这段代码会出错 include
  • 为@Annotation枚举分配一个值

    我创建 enum Restrictions none enumeration fractionDigits length maxExclusive maxInclusive maxLength minExclusive minInclusi
  • 枚举和 Clojure

    在Java C世界中 人们经常使用枚举 如果我使用的是使用枚举的 Java 库 我可以在它们和关键字之间进行转换 例如 使用 java lang Enum valueOf e aget Ljava lang Enum e getEnumCo
  • 为什么 Rust 在运行时检查数组边界,而(大多数)其他检查发生在编译时?

    正在阅读基本介绍 http doc rust lang org book arrays vectors and slices html 如果您尝试使用不在数组中的下标 您将收到错误 数组访问在运行时进行边界检查 为什么 Rust 在运行时检
  • 如何将计算值转换为文字以进行枚举初始化

    我遇到了枚举的问题 因为我想将 case 初始化为双精度值PI 180 有没有办法通过常量或一些时髦的魔法获取这个计算值并将其转换为文字 以便我可以初始化枚举 我宁愿不必做3 14 我宁愿使用该值的实际编译器和硬件计算表示 所以我的第一次尝
  • WPF ComboBox 中具有本地化名称的枚举

    我有一个列出枚举的组合框 enum StatusEnum Open 1 Closed 2 InProgress 3
  • JAXB 枚举字段未序列化

    我有以下课程 package dictionary import java io Serializable import java util Objects import javax xml bind annotation XmlEleme
  • 您可以传递“类型”作为参数吗?

    我想在 VB NET 中做类似以下的事情 可以吗 Function task value as Object toType as Type Return DirectCast value toType End Function 是的 有系统
  • 无法发出桥接标头的预编译标头

    我从 GitHub 下载了一个项目 然后 pod 了以下文件 其中一些文件是由 OBJ C 编写的 我使用了桥接头 pod SnapKit pod MJRefresh pod Alamofire pod Kingfisher pod MBP
  • 如何将 char 转换为 unsigned int?

    我有一个字符数组 它实际上用作字节数组 而不是用于存储文本 在数组中 有两个特定字节表示我需要存储到无符号 int 值中的数值 下面的代码解释了设置 char bytes bytes 2 bytes 0 0x0C For the sake
  • 严格别名是c还是c++的事情?

    在 ISO IEC 9899 TC2 中 该标准规定如下 6 3 2 3 指针 指向对象或不完整类型的指针可以转换为指向不同类型的指针 对象或不完整类型 如果生成的指针未针对所指向的类型正确对齐 则行为未定义 否则 当再次转换回来时 结果应
  • 自动铸造[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我现在正在遭受脑放屁的痛苦 我以前曾经这样做过 但我不记得确切的语法 也无法查看我编写的代码 因为我当时在另一家公司工作 我有这样的安排 class
  • 如何获取在代码中 attrs.xml 中创建的枚举

    我创建了一个自定义视图 找到它here https bitbucket org informatic0re awesome font iconview 具有枚举类型的可声明样式属性 在 xml 中 我现在可以为我的自定义属性选择枚举条目之一
  • C++20 范围太多 |运营商?

    我在这段代码中使用 g 10 2 有谁知道为什么我最后收到编译器错误std views reverse on results3 include
  • 枚举的子类化

    有没有一种简单的方法来子类化Javaenum 我问这个问题是因为我有大约 10 个实现相同接口的对象 但它们对某些方法也有相同的实现 因此我想通过将所有相同的实现放置在扩展的中间对象中来重用代码Enum它也是我需要的所有其他类的超类 或许事
  • C++ 强制转换运算符重载 [重复]

    这个问题在这里已经有答案了 我有一个只有一个 int 成员的类 例如 class NewInt int data public NewInt int val 0 constructor data val int operator int N
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • 自定义类的重写 bool() [重复]

    这个问题在这里已经有答案了 我想要的只是 bool myInstance 返回 False 并且 myInstance 在 if or and 等条件下计算为 False 我知道如何覆盖 gt 我试过这个 class test def bo

随机推荐