【问题标题】:How does C compiler treat enum?C 编译器如何处理枚举?
【发布时间】:2020-06-17 20:21:22
【问题描述】:

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-type 变量:

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

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

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

【问题讨论】:

标签: c enums


【解决方案1】:

在 C 中,枚举常量(即值 zero, one, two, three)的类型为 int

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

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

枚举类型参与隐式整数转换,并根据其大小进行排名。

【讨论】:

    【解决方案2】:

    在 C 中,枚举属于整数类型。来自 C 标准(6.2.5 类型)

    17 char类型,有符号和无符号整数类型,以及 枚举类型统称为整数类型。整数 而真正的浮动类型统称为真正的类型。

    在 C++ 中,枚举不是整数类型,但它们可以提升为整数类型。

    如果不考虑 C++ 范围枚举,这是 C 和 C++ 枚举类型的主要区别。

    至于这个说法

    如果在函数或类中声明了某个枚举,则不能 在声明的函数/类之外访问。这不适用于 C.

    那就错了。在 C 中的块作用域(包括函数最外层的块)中声明的枚举在该块之外是不可见的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多