首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以把‘`enum`’变量看作C17中的‘in’吗?

我可以把‘`enum`’变量看作C17中的‘in’吗?
EN

Stack Overflow用户
提问于 2021-03-13 10:26:51
回答 1查看 291关注 0票数 1

TL;DR:假设enum NAME {...};在执行过程中enum NAME nint n是相同的,这是正确的吗?即使n被声明为enum NAME,它是否可以像一个signed int那样对其进行操作?原因是:我非常想使用enum类型作为返回标志,作为位操作的“关闭”类型。

例如:让typedef enum FLAGS { F1 = 0x00000001, F2 = 0x00000002, F3 = 0x00000004 } FLAGS ;然后,FLAGS f = F1 | F2;3分配给f,不抛出相关的错误或警告。这个和许多其他编译器允许的使用场景,比如f++,让我觉得我可以合法地对待f,就像对待signed int一样。编译器使用: MSVC'19,16.9.1,设置"C17 (2018年)标准(/std:c17)";

我搜索了标准(草图这里),并查看了其他相关的问题,没有发现什么嫌疑人(并且希望)是enum NAME x的“无声推广”到signed int x,即使标识符有这种类型。这使我相信,当分配一个非成员的值时,enum的行为方式是依赖于实现的。我要求,部分是为了证实或否认这一说法。

EN

回答 1

Stack Overflow用户

发布于 2021-03-13 11:24:09

这是你所链接的PDF的第6.4.4.3章:

声明为枚举常量的标识符具有int类型。

您认为将enum NAME x提升到signed int x的想法并不是真的,因为标识符 NAME的类型是int x是用于定义标识符的类型,它被提升为int

此外,整数提升在整数操作中进行。

编辑

有些编译器非常重视enumint之间的区别,特别是如果他们可以选择将位宽度缩小到最小的话。例如,我在作业的项目中使用的那个,会自动根据定义的值插入对enum值的每次使用情况的检查。此外,IIRC拒绝所有隐式转换,我们需要显式转换如下:

代码语言:javascript
复制
FLAGS f = (FLAGS)((int)F1 | (int)F2);

但这是这种特殊野兽的延伸,它有特殊的安全选项.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66612380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档