TL;DR:假设enum NAME {...};在执行过程中enum NAME n和int 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的行为方式是依赖于实现的。我要求,部分是为了证实或否认这一说法。
发布于 2021-03-13 11:24:09
这是你所链接的PDF的第6.4.4.3章:
声明为枚举常量的标识符具有
int类型。
您认为将enum NAME x提升到signed int x的想法并不是真的,因为标识符 NAME的类型是int。值 x是用于定义标识符的类型,它被提升为int。
此外,整数提升在整数操作中进行。
编辑
有些编译器非常重视enum和int之间的区别,特别是如果他们可以选择将位宽度缩小到最小的话。例如,我在作业的项目中使用的那个,会自动根据定义的值插入对enum值的每次使用情况的检查。此外,IIRC拒绝所有隐式转换,我们需要显式转换如下:
FLAGS f = (FLAGS)((int)F1 | (int)F2);但这是这种特殊野兽的延伸,它有特殊的安全选项.
https://stackoverflow.com/questions/66612380
复制相似问题