为什么直接比较两个枚举时会出现错误?

2024-01-21

我有一些代码正在移植到新平台,它开始给我一个关于比较两个不同枚举器列表中的两个枚举器的错误。我很困惑为什么它会给我一个关于此的错误。

C 规范 (6.7.2.2) 的枚举规范部分指出:

The identifiers in an enumerator list are declared as constants that have type int and may appear wherever such are permitted.127) An enumerator with = defines its enumeration constant as the value of the constant expression. If the first enumerator has no =, the value of its enumeration constant is 0.

所以我应该能够像 int 常量一样使用枚举成员。在这个小示例程序中:

enum first {
  a,
  b
};

enum second {
 c,
 d
};

int main(){
    enum first myf = a;
    enum second mys = c;

    if(myf == mys)
        printf("same value\n"); 
    return 0;
}

当编译时gcc -Wall -Werror我收到消息:

错误:‘enum first’和‘enum secondary’之间的比较 [-Werror=enum-compare]

我知道如果我同时输入myf and mys as int编译器会很高兴,就像我可以设置几个ints 的值来自myf and mys并进行比较;但为什么我必须这样做either这些来摆脱警告?为什么这个警告首先存在?这样做肯定存在一些我没有看到的危险。


NOTE:
我已阅读关于此 enum-compare 标志的 gcc 文档,但它没有说明太多内容:

-Wenum-比较
警告不同枚举类型的值之间的比较。在 C++ 中,条件表达式中的枚举不匹配也会被诊断出来,并且默认情况下会启用警告。在 C 中,此警告由 -Wall 启用。


这不是由于标准合规性问题而发出的警告,而是“这似乎不对”类型的警告之一。如果您考虑枚举的典型用途,那么在许多情况下进行这样的比较并没有多大意义。例如:

enum Day {
  Sunday,
  Monday,
  Tuesday,
  Wednesday,
  Thursday,
  Friday,
  Saturday
};

enum Month {
  January,
  February,
  March,
  April,
  May,
  June,
  July,
  August,
  September,
  October,
  November,
  December
};

enum Day day = Wednesday;
enum Month month = April; 

if (day == month) { ... }

这评估为 true,但一般来说,比较没有多大意义。如果您知道您是认真的,那么类型转换将使编译器信服,正如您所指出的。

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

为什么直接比较两个枚举时会出现错误? 的相关文章

  • 如何在 Windows 窗体上将 CausesValidation 设置为 false 以关闭[Xbox?

    我已经将取消按钮上的 CausesValidation 设置为 false 并且它可以工作 bool IsCancelBtnClicked false private void EmployeeIDtextBox Validating ob
  • 如何在 C# 中导航任何 JSON 树?

    我需要像导航 XML 一样导航 Json 结构XmlDocument 结构未知 我需要迭代节点来解析一些数据 这可能吗 我知道我可以使用JavaScriptSerializer将其反序列化为已知类型 但事实并非如此 因为我可以接收任何有效的
  • 在应用程序版本中使用 svn 修订号

    在 VS2010 解决方案 不是 NET 中 我希望将 svn 修订号作为应用程序版本的一部分包含在内 我们目前不使用 makefile 仅使用 VS 解决方案 项目设置 我想在编译时获取工作副本修订号 将其存储到变量中 以便稍后在代码中使
  • 如何在编译时检查该类是否是抽象的?

    我所说的抽象类是指至少具有一个纯虚方法的类 如果检查显示该类是 我希望编译失败not抽象的 有可能吗 Use std is abstract http en cppreference com w cpp types is abstract
  • 如何在类的 Dispose 方法中取消订阅匿名函数?

    我有一个 A 类 在它的构造函数中 我正在为 Object B 的 eventHandler 分配一个匿名函数 如何从 A 类的 Dispose 方法中删除 取消订阅 它 任何帮助 将不胜感激 谢谢 Public Class A publi
  • 在 C++ 中将惰性生成器实现为forward_iterator

    MyGenerator 表示 可能 有限的整数序列 计算成本很高 所以我不想预先生成它们并将它们放入容器中 struct MyGenerator bool HasNext int Next 要打印全部 MyGenerator generat
  • 寻找发音的正确性

    我需要借助 Microsoft 语音 SDK 来识别用户发音的 质量 System Speech Recognition 我使用的是 MS Speech Engine US 所以我实际需要的是找出说话者的声音与 北美 口音的接近程度 实现此
  • 在C中获取终端宽度?

    我一直在寻找一种从 C 程序中获取终端宽度的方法 我不断想出的是这样的东西 include
  • 为什么零长度 stackalloc 会让 C# 编译器乐意允许条件 stackalloc?

    下面的 修复 让我很困惑 这里的场景是根据大小有条件地决定是否使用堆栈还是租用缓冲区 然而 这是一个相当小众但有时必要的优化 使用 明显 实现 数字 3 推迟明确的分配 直到我们真正想要分配它 编译器抱怨 CS8353 类型为 Span 的
  • 如何在Unity中集成xAPI / TinCan

    我是 xAPI TinCan API 的新手 所以我的问题可能有点笼统 但到目前为止我还没有找到任何可以帮助我的东西 我认为可以将 xAPI 集成到 Unity 项目 游戏或模拟 中 但我到底该怎么做呢 我可以阅读有关 xAPI 和 Uni
  • 如何在 Windows 中获取和设置系统音量

    我想使用 unity 和 c 将键盘点击时的操作系统音量设置为一定水平 例如我想将 Windows 音量 不是 unity 设置为 70 我该怎么做 void Update if Input GetKeyDown KeyCode A Set
  • FileStream.(Begin/End)(Read/Write)的同步要求

    Net 可以接受以下多线程调用模式吗文件流 http msdn microsoft com en us library y0bs3w9t 28v VS 90 29 aspx 多个线程调用这样的方法 ulong offset whatever
  • 使用实体框架如何在没有一个庞大查询结果集或数百个小型查询的情况下创建嵌套对象?

    我使用 EF 填充对象 然后在业务层代码中与之交互 这些对象有多个级别 但我们首先将其简化为典型的主从示例Order and OrderLine 假设我需要检索 50 个订单 每个订单大约有 100 个订单行 并且我需要所有这些数据 在 E
  • 高效快速的线程参数方法

    创建带参数的线程最有效的方法是什么 参数是一个结构体 如果该结构体不能保留在父线程堆栈上 有两种解决方案 具有动态内存分配 struct Arg int x int y void my thread void v arg Arg arg A
  • C#中私有类的概念

    除了内部类之外 C 中是否可以存在私有类 根本不 除非它在嵌套类中 否则什么都没有 未嵌套在其他类或结构中的类和结构可以是public or internal 声明为 public 的类型可由任何其他类型访问 声明为内部的类型只能由同一程序
  • 我可以使用什么 C++ 库在 Windows 上将 PDF 转换为图像?

    我正在开展一个需要分析图像的项目 这些图像的主要来源是网络摄像头 但最近我们被要求添加对上传文件和扫描仪的支持 这在大多数情况下都很好 只是他们希望我们能够使用 PDF 格式的文档 我需要一个原始像素位图进行处理 在 Mac 上 我可以使用
  • c# Abstract Generic Class继承自Abstract Generic Class

    我正在尝试创建一个抽象泛型类 它继承自另一个抽象泛型类 这是我到目前为止所拥有的 public abstract class BaseClass public long Id get private set public BaseClass
  • 从 Linux 内核模块的文件描述符获取文件名/路径?

    在Linux内核模块中 有没有一种方法可以从文件名 路径中获取文件名 路径 unsigned int fd 我知道这个答案 如何从内核模块内的文件描述符获取文件名 https stackoverflow com questions 8250
  • AppDomain.CurrentDomain.GetAssemblies 失败并出现 ReflectionTypeLoadException

    在单元测试期间 我遇到了以下代码的问题 该代码要求所有加载的程序集 var res AppDomain CurrentDomain GetAssemblies SelectMany x gt x GetTypes ToList 此代码失败并
  • 判断一个点是否在多面体内部

    我试图确定某个特定点是否位于多面体内部 在我当前的实现中 我正在研究的方法采用我们正在寻找多面体面的数组 在本例中为三角形 但稍后可能是其他多边形 的点 我一直在尝试根据这里找到的信息进行工作 http softsurfer com Arc

随机推荐

  • 将全局变量传递给函数

    为什么下面的代码给我的是 0 而不是 1 我希望我的函数更改在函数外部声明的变量 但我不想在函数声明中指定该变量 that 0 function go input input go that console log that 正如 Orio
  • 从给定的物理和有效地址查找段地址

    如何从给定的数据中找到段地址 物理地址 0x119B 有效地址 0x10AB 公式可能是什么 x86 16位实模式下的有效地址只是20位的偏移量部分段 偏移量 address https thestarman pcministry com
  • 正则表达式 - 将数字与常量进行比较

    如果我想匹配所有小于 2000 的数字 我使用正则表达式 01 1 0 9 3 如果我想匹配 1 到 5 之间的所有数字 我可以使用表达式 2 4 1 但是如果我想匹配 5 到 123 之间的所有数字怎么办 有语法吗 要匹配数字 gt 5
  • 混合内容 - 不安全的样式表

    在浏览器中 我收到以下错误 混合内容 页面位于 https www website com https www website com 通过 HTTPS 加载 但请求不安全的样式表 http fonts googleapis com css
  • 使用自定义错误处理程序时如何从中止命令访问错误消息

    使用 python Flask 服务器 我希望能够使用 abort 命令抛出 http 错误响应 并在正文中使用自定义响应字符串和自定义消息 app errorhandler 400 def custom400 error response
  • Python-LDAP 无法编译[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 所以我从源代码中获得了最新的 pyt
  • Django heroku 静态目录

    我是 Heroku 的新手 我尝试了一个没有 css 的简单 django 应用程序 但我刚刚在我的应用程序中添加了一个 css 文件 当我这样做时 git push heroku master 静态文件收集失败 gt Collecting
  • 无论数据源如何,使用 Django/Django Rest Framework 验证和保存数据的正确过程是什么?

    我有一个特定的模型 我想对其执行自定义验证 我想保证在创建新实例时始终存在至少一个标识符字段 这样就不可能在没有这些字段之一的情况下创建实例 尽管没有特别需要单独的字段 from django db import models class
  • Huggingface 分类与预测作斗争

    我正在微调 longformer 然后使用进行预测TextClassificationPipeline and model inputs 方法 我不确定为什么会得到不同的结果 import pandas as pd import datas
  • 解析器未共享给依赖的 sbt 项目?

    在这个似乎涉及 xsbt web plugin 的奇怪情况下 我收到错误 unresolved dependency play play json 2 10 2 2 SNAPSHOT not found 当加载时server子项目 依赖项和
  • 使用 Validating 事件和 ErrorProvider 进行验证 - 显示错误摘要

    当我的 WinForms 中存在错误时 如何显示消息框 数据无效 尝试过类似的东西 但它不起作用 if errorprovider1 null MessageBox Show Data is invalid 也许我必须使用 bool 来解决
  • 不区分大小写的三元搜索树

    我一直在使用三元搜索树 http en wikipedia org wiki Ternary search tree有一段时间 作为数据结构来实现一个自动完成下拉组合框 这意味着 当用户输入 fo 时 将显示下拉组合框 富 食物 足球 问题
  • 线性图表中 x 轴上的多条线未显示

    我有一个单轴折线图 用户会选择year从下拉菜单中选择loan type从另一个下拉菜单 然后图表应加载 12 个月的记录annual payment and scheduled payment 两者都是线性线 仪表板 vue div cl
  • 按发布日期列出的可用.packages

    是否可以从 R 中获取 CRAN 包的发布日期 我想获取 k 个最近发布的 CRAN 软件包的列表 或者获取 dd mm yy 日期之后发布的所有软件包的列表 类似于上面的信息available packages by date html
  • 用特征名称绘制特征重要性

    在 R 中 有预先构建的函数来绘制随机森林模型的特征重要性 但在python中似乎缺少这样的方法 我在寻找一种方法matplotlib model feature importances给了我以下内容 array 2 32421835e 0
  • 查找特定 ClearCase 分支中修改的所有文件?

    有没有办法创建一个视图 为我提供在特定 ClearCase 分支中修改的所有文件的快照 例如 假设我有两个分支 product 1 0 dev product migration 1 0 dev 第二个分支被认为是升级我们的核心框架依赖项的
  • istringstream、ostringstream 和 stringstream 之间有什么区别? / 为什么不在所有情况下都使用 stringstream?

    我什么时候用std istringstream std ostringstream and std stringstream为什么我不应该使用std stringstream在每种情况下 是否存在运行时性能问题 最后 这有什么不好的地方 而
  • Springboot嵌入tomcat绑定IPV6

    我正在使用 springboot 开发rest api 当我尝试部署它自动绑定到我们不想要的ipv6的jar时 我遇到了小问题 我知道我可以使用外部tomcat 但只是为了学习 我想知道是否可以强制它绑定到 ipv4 谢谢 萨吉德 您可以使
  • IFrame 和父级之间的跨文档消息传递问题

    我有一个应用程序在 外部 页面 不同域等 的 iframe 内运行 为了允许 iframe 和父级之间进行一些基本通信 我在父级页面上加载了我的一些脚本并使用postMessage进行一些跨文档消息传递 大多数时候 这种通信会按预期进行 但
  • 为什么直接比较两个枚举时会出现错误?

    我有一些代码正在移植到新平台 它开始给我一个关于比较两个不同枚举器列表中的两个枚举器的错误 我很困惑为什么它会给我一个关于此的错误 C 规范 6 7 2 2 的枚举规范部分指出 The identifiers in an enumerato