关于在C中使用枚举:是否可以更改枚举成员的值?

时间:2011-12-01 00:36:31

标签: c enums

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

例如,我说:

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

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

有没有办法在代码中更改红色,蓝色和绿色的值?

我在想这样的事情:

yourcolor.red = 56; etc...

我知道你应该使用这样的结构,但这只是我今天想到的,我找不到答案。

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:2)

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

来自C99(强调我的):

  

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

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

  

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

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

答案 1 :(得分:2)

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

您可以使用变量:

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

这些可以改变。

答案 2 :(得分:2)

简短回答是“否” - 在定义枚举常量后,您无法更改枚举常量的值。

从语义上讲,这样做没有任何意义。使用枚举类型的重点是抽象出底层表示 - 你关心颜色是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的对象应采用其中一个值blackred,{ {1}},bluegreenmagentacyanyellow(与底层整数值无关)。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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