2012-01-05 88 views
2

我有遺留代碼使用enum作爲範圍並遍歷範圍。我需要將這個平臺移植到一個新的平臺上,讓它更安全。實現範圍數據類型

注意:enum s是不安全的,因爲值之間可能存在「空洞」或間隙。

我正在尋找安全的C語言模式的範圍類型。例如,給定一個範圍(紅色,紫色,藍色,綠色,黃色,橙色),我想遍歷每個值,如「對於顏色輸入(紅色,紫色,藍色,綠色,黃色,橙色) 」。

當我搜索到網頁和網頁時,我收到了關於數據類型範圍的回覆,例如整數範圍。

此代碼將駐留在使用ARM7處理器的嵌入式系統上。

+0

默認情況下可以有間隙嗎?你總是可以指定enums的值,比如'enum {zero = 0,one = 1,two = 2};',不是? – 2012-01-05 17:52:47

+0

問題是當有人在「enum」中插入「four = 4」時,那麼未定義的行爲將導致(或很難找到錯誤)。 – 2012-01-05 18:14:04

回答

3

枚舉可以做得很好,只要讓編譯器選擇值ES。這樣,就沒有漏洞了。你可以,例如,做到這一點:

enum colors { 
    FIRST_COLOR=0, 
    RED=FIRST_COLOR, VIOLET, BLUE, GREEN, YELLOW, ORANGE, 
    NUM_COLORS 
} 

enum colors color; 
for (color=FIRST_COLOR; color<NUM_COLORS; color++) { 
    // whatever 
} 

而且從ANSI C標準的報價:

如果第一枚舉沒有=,其枚舉值 常數爲0 。沒有=每個後續枚舉通過加入1至先前枚舉常數的值限定其 枚舉常數所獲得 常量表達式的值

+0

我的編譯器IAR給我*「與另一種類型混合的枚舉類型」* for for(color = 0; color 2012-01-05 18:19:22

+0

對於海灣合作委員會,枚舉和整數可以自由混合。我其實希望它對這樣的混音提出警告。我認爲使用FIRST_COLOR應該可以滿足任何編譯器。 – ugoren 2012-01-05 19:48:14

+0

我非常喜歡'FIRST_COLOR'技巧。這使得迭代循環更易於讀取,並且在枚舉列表被修改時不易發生「事故」。 – 2012-01-06 16:09:53

1

你可以使用一個數組:

static Color colors[] = {Red, Violet, Green, Yellow, Orange}; 
#define SIZE(x) sizeof(x)/sizeof(*x) 

for(x=0; x<SIZE(colors); x++){ 
     //do stuff with colors[x] 
} 

否則,你看到了以往的模式是:

enum Colors {FirstColor, Red=0, Violet, Green, Yellow, Orange, LastColor}; 

for(x=FirstColor; x<LastColor; x++){ 
    //do stuff with x. 
} 

但如果方式遍歷這些變化,你總是可以定義一個函數nextcolor(),和:

for(x=FirstColor;x<LastColor;x=nextcolor(x)){ 
    //do stuff with x. 
}