2011-12-01 270 views
1

因此,这似乎是一个愚蠢的quesiton,但我想知道是否有任何方式改变C.关于在C中使用枚举:是否可以改变枚举成员的值?

例如一个枚举成员的值,说我有:

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

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

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

我的想法是这样的:

yourcolor.red = 56; etc... 

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

任何帮助,将不胜感激。

+0

枚举通常在事先已知所有枚举的情况下使用 - 将推荐您提及的结构 – jakx

回答

2

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

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

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

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应该拿上值blackredblue,​​,magenta之一,cyanyellow,或white(不考虑底层的整数值)。

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

2

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

C99(重点煤矿):

在枚举列表中的标识符声明为常量是 有一个int类型和可能出现的地方,例如允许

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

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

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

+1

根据C99规范,类型是由编译器。 –

+0

@Nick - 查看我的更新。 –

+0

@Iwburk:注意到,优点+1 –

2

不,这是不可能的。那么,它会在不同的翻译单位工作,虽然这可能不是你想要的。

可以使用,虽然一个变量:

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

这些是可以改变的。

0

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

0

看起来这似乎不合理。枚举实际上是常量,我假设它们被硬编码为机器指令。

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