我有遗留代码,它使用enum
作为范围并遍历范围。我需要将其移植到一个新平台并使其更安全。
注意:enum
不能安全迭代,因为值之间可能存在“漏洞”或间隙。
我正在为范围类型寻找安全的C语言模式。
例如,给定范围(RED,VIOLET,BLUE,GREEN,YELLOW,ORANGE),我想迭代每个值,例如“FOR color IN(RED,VIOLET,BLUE,GREEN,YELLOW,ORANGE)”
当我搜索SO和网络时,我会收到有关数据类型范围的回复,例如整数的范围。
此代码将驻留在使用ARM7处理器的嵌入式系统上。
答案 0 :(得分:3)
只要你让编译器选择值,枚举就可以了。这样,就没有洞了。例如,你可以这样做:
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添加到先前枚举常量的值
答案 1 :(得分: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.
}