实现范围数据类型

时间:2012-01-05 17:47:31

标签: c enums iterator iteration range

我有遗留代码,它使用enum作为范围并遍历范围。我需要将其移植到一个新平台并使其更安全。

注意:enum不能安全迭代,因为值之间可能存在“漏洞”或间隙。

我正在为范围类型寻找安全的C语言模式。

例如,给定范围(RED,VIOLET,BLUE,GREEN,YELLOW,ORANGE),我想迭代每个值,例如“FOR color IN(RED,VIOLET,BLUE,GREEN,YELLOW,ORANGE)”

当我搜索SO和网络时,我会收到有关数据类型范围的回复,例如整数的范围。

此代码将驻留在使用ARM7处理器的嵌入式系统上。

2 个答案:

答案 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.
 }