【问题标题】:Regarding usage of enums in C: would it be possible to change the value of enum members?关于 C 中枚举的使用:是否可以更改枚举成员的值?
【发布时间】:2011-12-01 00:36:31
【问题描述】:

所以这似乎是一个愚蠢的问题,但我想知道是否有任何方法可以更改 C 中枚举成员的值。

例如,假设我有:

enum yourcolor{red = 43, blue = 54, green = 89};

enum yourcolor blue-green = red*blue*green;

以后有办法在代码中更改红色、蓝色和绿色的值吗?

我在想这样的事情:

yourcolor.red = 56; etc...

我知道你应该为这样的事情使用结构,但这只是我今天正在考虑的事情,我找不到答案。

任何帮助将不胜感激。

【问题讨论】:

  • 枚举通常在所有枚举都事先知道的情况下使用——会推荐你提到的结构。

标签: c enums


【解决方案1】:

简短的回答是“否”——在定义枚举常量后,您不能更改它的值。

从语义上讲,这样做没有任何意义。使用枚举类型背后的全部意义在于抽象出底层表示——您关心颜色是red,而不是 43 或 56 或其他任何颜色。换句话说,如果red 是 43 或 56很重要,那么您不应该使用枚举。

当您创建一个枚举类型的对象时,您基本上是在说该对象只能采用这些枚举值之一;它可以是redbluegreen。如果要表示辅助颜色,则需要为这些辅助颜色定义枚举常量。您可以根据包含主要元素的表达式来定义这些次要元素。以下是许多可能的编码之一:

enum color {black   = 0x00,              // binary 0000
            red     = 0x01,              // binary 0001
            blue    = 0x02,              // binary 0010
            green   = 0x04,              // binary 0100
            magenta = red | blue,        // binary 0011
            cyan    = blue | green,      // binary 0110 
            yellow  = red | green,       // binary 0101
            white   = red | blue | green // binary 0111
};

显示的编码很方便;它们展示了如何从原色构建二次色。它们也是完全任意的;您可以将类型定义为

enum color {black, red, blue, green, magenta, cyan, yellow, white};

并且完全不用担心基础值(分别为 0、1、2、3、4、5、6 和 7)。

通过创建此类型,您暗示enum color 类型的对象应该采用值blackredbluegreen 之一、magentacyanyellowwhite(与基础整数值无关)。

当然,C 对此并不严格:枚举类型的对象可以保存任意整数值,即使该值没有出现在枚举常量列表中。但是这样做,你打破类型隐含的概念模型。

【讨论】:

    【解决方案2】:

    不,这是不可能的。好吧,它可以在不同的翻译单元中工作,尽管这可能不是你想要的。

    您可以使用变量:

    typedef int color;
    color red = 43;
    color blue = 54;
    color green = 89;
    

    这些可以更改。

    【讨论】:

      【解决方案3】:

      没有。 enum 中的标识符被声明为常量。

      来自C99(强调我的):

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

      注意,稍后在同一部分(斜体我的):

      每个枚举类型都应与整数类型兼容。这 类型的选择是实现定义的,但应该能够 表示枚举所有成员的值。

      更一般地说,我会质疑这种功能的动机。 枚举,根据定义,是某个集合的所有成员的完整列表,其值在正常情况下可能不应该改变。

      【讨论】:

      • 根据 C99 规范,类型由编译器实现定义。
      【解决方案4】:

      我认为不太可能。枚举值可能在编译时被常量静态替换,因此分配给它们的行为会很古怪(最坏的情况),或者作为错误被拒绝(最好的情况)。

      【讨论】:

        【解决方案5】:

        这似乎没有意义。枚举实际上是常量,我假设它们被硬编码到机器指令中。

        这意味着程序无法知道它们何时发生变化。如果你在一个非线性的程序中改变它,当你跳回来时会发生什么?比如在循环或 goto 语句中?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-21
          • 1970-01-01
          • 2010-11-26
          • 1970-01-01
          相关资源
          最近更新 更多