【问题标题】:Difference between using enum and int variables in C在 C 中使用 enum 和 int 变量的区别
【发布时间】:2020-11-24 16:37:54
【问题描述】:

有什么区别

enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun};
enum week day = Wed; 

enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun};
int day = Wed;

在 C 语言中?

我找不到使用 enum 类型的变量比使用常规的 int 有什么好处。

【问题讨论】:

  • ...可读性...
  • sizeof(enum week) 可能小于sizeof(int)。 C 规范说枚举类型将与char、有符号整数类型或无符号整数类型兼容。我想编译器可以使类型比int更宽,但是由于所有枚举常量都是int类型,所以它不需要比int更宽。

标签: c enums integer int constants


【解决方案1】:

enum 的标识符/常量的类型为int,因此可以将它们的值分配给int 变量:

“枚举器列表中的标识符被声明为具有int 类型的常量,并且可以出现在任何允许的地方。”

C18,§6.7.7.2/3

但是,枚举的类型可能因实现而异:

"每个枚举类型应与char、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,131) 但应能够表示所有成员的值枚举。”

C18,§6.7.7.2/4

因此,在处理enums 时,坚持使用enum 类型可能会防止任何类型的问题,而且可读性更高。


另一件事是很容易将另一个enum 类型的常量分配给day,如果它的类型为int

enum week {Mon, Tue, Wed, Thur, Fri, Sat, Sun};
enum month {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dez};

int day = Mar;

这编译没有问题。

高级编译器可以在使用类型 enum week 代替 day 时会为此引发警告,并为此添加额外的安全层。

enum week {Mon, Tue, Wed, Thur, Fri, Sat, Sun};
enum month {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};

enum week day = Mar;

例如,Clang,10.0 抛出没有任何附加标志:

"警告:从枚举类型'enum month'隐式转换为不同的枚举类型'enum week' [-Wenum-conversion]"

GCC,10.1 需要 -Wall-Wenum-conversion 标志来发出相同的警告。


这篇文章也涉及类似的问题,但我不会将其声明为重复:

此外,我发现了这篇有趣的文章:

【讨论】:

    【解决方案2】:

    这样做的好处是,使用enum 可以让阅读您的代码的人和编译器更清楚您的意图。例如,如果您使用不完整的 switch 案例的枚举,任何中途编译器都会警告您:

    switch (day) {
        case Mon: printf("Monday\n"); break;
        case Tue: printf("Tuesday\n"); break;
    }
    

    这里 GCC(带有-Wall)发出:

    警告:枚举值 'Wed' 未在开关 [-Wswitch] 中处理

    7 |     switch (day) {
      |     ^~~~~~
    

    如果day 的类型是int,您将不会收到这个非常有用的警告。

    【讨论】:

    • 也许值得注意的是:这个警告只会在default case被省略时抛出,而不是在没有的时候。
    【解决方案3】:

    C 中的枚举是一种为不一定有序的小集合创建符号常量的便捷方式。

    它们不是 C 中的 高级抽象,它们在 Java 或 C# 中的方式不同。它们是底层的整数类型,并且因为 C 相信 您始终知道自己在做什么,并且永远不会犯错误,所以当您混合搭配 @987654321 时它不会抱怨@ 和 int 类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-20
      • 2016-09-28
      • 2010-12-27
      • 2015-04-05
      • 2010-09-12
      • 2020-05-09
      • 2019-03-26
      • 1970-01-01
      相关资源
      最近更新 更多