2011-12-01 277 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語句中一樣?