Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 实现范围数据类型_C_Enums_Iterator_Iteration_Range - Fatal编程技术网

C 实现范围数据类型

C 实现范围数据类型,c,enums,iterator,iteration,range,C,Enums,Iterator,Iteration,Range,我有一个遗留代码,它使用enum作为一个范围,并在该范围内迭代。我需要把它移植到一个新的平台上,让它更安全 注意:enums不安全,因为值之间可能存在“漏洞”或间隙 我正在为范围类型寻找一种安全的C语言模式 例如,给定一个范围(红色、紫色、蓝色、绿色、黄色、橙色),我希望遍历每个值,如“For color IN(红色、紫色、蓝色、绿色、黄色、橙色)” 当我搜索SO和web时,会得到关于数据类型范围的回复,例如整数范围 此代码将驻留在使用ARM7处理器的嵌入式系统上。您可以使用阵列: stati

我有一个遗留代码,它使用
enum
作为一个范围,并在该范围内迭代。我需要把它移植到一个新的平台上,让它更安全

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

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

例如,给定一个范围(红色、紫色、蓝色、绿色、黄色、橙色),我希望遍历每个值,如“For color IN(红色、紫色、蓝色、绿色、黄色、橙色)”

当我搜索SO和web时,会得到关于数据类型范围的回复,例如整数范围


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

您可以使用阵列:

 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 {
    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
}
枚举颜色{
第一种颜色=0,
红色=第一颜色,紫色,蓝色,绿色,黄色,橙色,
数字颜色
}
枚举颜色;

对于(color=FIRST\u color;color默认情况下是否有间隙?您可以始终指定枚举的值,如
enum{zero=0,one=1,two=2};
,否?问题是当有人将“four=4”插入
enum
,则会产生未定义的行为(或很难找到错误)。我的编译器IAR正在给我提示
for的“枚举类型与其他类型混合”(颜色=0;颜色<橙色;颜色++)
,但我想这是因为0。我用于gcc,在gcc中枚举和整数可以自由混合。我真希望它能警告这种混合。我认为使用FIRST_COLOR应该满足任何编译器。我非常喜欢
FIRST_COLOR
技巧。这使迭代循环更具可读性,更不容易发生“意外”“当修改枚举列表时。
 for(x=FirstColor;x<LastColor;x=nextcolor(x)){
     //do stuff with x.
 }
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
}