【问题标题】:Why enumeration objects can have values other than their enumerators in C? [duplicate]为什么枚举对象可以具有除 C 中的枚举数以外的值? [复制]
【发布时间】:2016-01-27 08:53:18
【问题描述】:

这是我的代码:

#include <stdio.h>
int main()
{   
    enum C {green = 5, red};
    enum CC {blue, yellow} cc = green;
    printf("%i\n", cc);
    return 0;
}

它会编译并产生控制台输出 5。

cppreference.com 说“枚举类型是一种独特的类型,其值仅限于几个显式命名的常量(枚举常量)之一”。我真的很困惑。

顺便说一下,我使用的编译器是 gcc 版本 4.8.1。

【问题讨论】:

  • cppreference 的注释有误
  • @M.M 评论已更新

标签: c


【解决方案1】:

您正在阅读 C++ 文档以了解 C? C 和 C++不是同一种语言。

在 C 中,enum 实际上是一个整数类型,您可以这样处理它。这意味着您可以为其分配一个可能不是规定值之一的整数。

但是,这样做被认为是不好的做法,一些编译器或静态代码检查器可以选择警告此类做法。

另一方面,在 C++ 中,枚举本身就是不同的类型,在 C++ 中不允许这样做,至少不能隐含地这样做。将其编译为 C++ 会导致编译错误。

【讨论】:

  • 尽管有名称,但链接的网站包含两种语言的信息。链接页面包含 C(不是 C++)的信息。
  • 网站 cppreference.com 有 c 和 c++ 参考。它们在内容上完全分开。在 C 中,如果 enum 可以将任何整数作为其值,而不是声明为其枚举数之一,则类型 enum 似乎与整数几乎相同。从枚举的字面意思来看,我认为枚举对象的值都被限制在一个整数集合中。
  • @Carousel 我认为它的指定有点不足。但是,如果我们采用只允许命名成员的解释,那么以下内容将不起作用:enum flags { FLAG_A = 0x01, FLAG_B = 0x02 }; ... enum flags f = FLAG_A | FLAG_B; 。然而,这是枚举的常见用法,我认为标准委员会本来打算支持这种用法。
【解决方案2】:

从 std 6.7.2.3(枚举内容)开始 - enum 的基础类型是实现定义的,但 enum 类型的变量可以分配任意数量的基础类型(至少是 @ 987654323@)。

每个枚举类型都应与 char、有符号整数类型或 无符号整数类型。 类型的选择是实现定义的,但应该是 能够表示枚举所有成员的值。这 在终止列表的 } 之后,枚举类型是不完整的 枚举器声明,然后完成。

编译器不需要检查您在 enum 变量中存储的内容是否是该枚举的有效值。

【讨论】:

    【解决方案3】:

    是的,C 编译器允许您这样做。

    你也可以这样做:

    #include <stdio.h>
    
    int main()
    {   
        enum C {green = 5, red};
        enum C  cc = 7;
        printf("%i\n", cc);
    
        return 0;
    }
    

    CPP 与 C 确实不同,所以不要将 CPP 引用应用于 C。

    【讨论】:

      【解决方案4】:

      在 C 中存在矛盾。所有枚举都是不同的类型。但是它们的枚举数是int 类型的整数常量。

      不检查给定的整数值是否对应于枚举中的指定枚举数集。

      在 C++ 中,矛盾被消除了。在 C++ 中,每个枚举器都具有与其声明枚举器的枚举相同的类型,而且没有从 int 类型到给定枚举类型的隐式转换。

      【讨论】:

        猜你喜欢
        • 2020-01-30
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 2019-07-18
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多