c - C 编译器如何处理枚举?

标签 c enums

enum 是用户定义的类型。一般来说,C 和 C++ 中的 enum 之间没有太大区别。 C++ 中的范围除外:如果某些 enum 在函数或类中声明,则无法在声明的函数/类之外访问它。这不适用于 C。

声明没有区别。 例如,可以如下声明新的 enum(对于 C 和 C++):

enum newEnum { zero = 0, one, two, three };

定义新变量几乎没有区别。 要使用新定义的类型定义新变量,可以使用以下行:

enum newEnum varA = zero; // though allowed to skip enum keyword in C++

但有一点很有趣。 在 C++ 中,您不能添加两个 enum 值并将结果分配给 enum 类型的变量:

varA = one + zero; // won't compile in c++

这是可以解释的:enum 值可以转换为 int 值,但反之则不行(intenum)。所以在最后一个例子中,编译器不能将 sum 的结果(类型为 int)分配给 varA(enum newEnum),因为它不能转换 int 到 newEnum。

但是在 C 中是可能的:最后一行代码成功编译。这让我很困惑。 因此出现了一个问题:C 编译器如何处理 enum?它甚至不是它的自定义类型吗?它只是 int 吗?

最佳答案

在 C 中,枚举常量(即值 0、1、2、3)的类型为 int

enum newEnum 类型也存在,但枚举器没有该类型。 enum newEnum 类型是整数类型,编译器可以选择类型的大小,但它必须至少大到足以容纳所有已定义的枚举数。在您的示例中,它的大小可能是 1、2、4、8 或其他任何值。

可以有枚举类型的变量和值,例如枚举 newEnum x = 3;++x;.

枚举类型根据其大小参与隐式整数转换。

关于c - C 编译器如何处理枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62437717/

相关文章:

c# - WPF 设计器引用枚举问题

java - 处理不再存在的枚举值的反序列化

我不能在 char 数组上设置空终止吗?

c - 是否可以在 SIGSEGV 处理程序中暂停 C 程序以进行进一步调查?

string - Swift 2.0 在字符串和枚举之间切换 :String

Java:类型转换枚举<?>

c - 使用为其他类型声明的内存

c - 为什么这段 C 代码对数字进行加法不起作用?

c - SetScrollRange 函数

objective-c - Objective-C 中的枚举定义形式