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
}