我有遺留代碼使用enum
作爲範圍並遍歷範圍。我需要將這個平臺移植到一個新的平臺上,讓它更安全。實現範圍數據類型
注意:enum
s是不安全的,因爲值之間可能存在「空洞」或間隙。
我正在尋找安全的C語言模式的範圍類型。例如,給定一個範圍(紅色,紫色,藍色,綠色,黃色,橙色),我想遍歷每個值,如「對於顏色輸入(紅色,紫色,藍色,綠色,黃色,橙色) 」。
當我搜索到網頁和網頁時,我收到了關於數據類型範圍的回覆,例如整數範圍。
此代碼將駐留在使用ARM7處理器的嵌入式系統上。
我有遺留代碼使用enum
作爲範圍並遍歷範圍。我需要將這個平臺移植到一個新的平臺上,讓它更安全。實現範圍數據類型
注意:enum
s是不安全的,因爲值之間可能存在「空洞」或間隙。
我正在尋找安全的C語言模式的範圍類型。例如,給定一個範圍(紅色,紫色,藍色,綠色,黃色,橙色),我想遍歷每個值,如「對於顏色輸入(紅色,紫色,藍色,綠色,黃色,橙色) 」。
當我搜索到網頁和網頁時,我收到了關於數據類型範圍的回覆,例如整數範圍。
此代碼將駐留在使用ARM7處理器的嵌入式系統上。
枚舉可以做得很好,只要讓編譯器選擇值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至先前枚舉常數的值限定其 枚舉常數所獲得 常量表達式的值
我的編譯器IAR給我*「與另一種類型混合的枚舉類型」* for for(color = 0; color
對於海灣合作委員會,枚舉和整數可以自由混合。我其實希望它對這樣的混音提出警告。我認爲使用FIRST_COLOR應該可以滿足任何編譯器。 – ugoren 2012-01-05 19:48:14
我非常喜歡'FIRST_COLOR'技巧。這使得迭代循環更易於讀取,並且在枚舉列表被修改時不易發生「事故」。 – 2012-01-06 16:09:53
你可以使用一個數組:
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.
}
默認情況下可以有間隙嗎?你總是可以指定enums的值,比如'enum {zero = 0,one = 1,two = 2};',不是? – 2012-01-05 17:52:47
問題是當有人在「enum」中插入「four = 4」時,那麼未定義的行爲將導致(或很難找到錯誤)。 – 2012-01-05 18:14:04