我真的希望我可以像下面这样使用枚举
typedef enum {
GPS_FULL_COLD = "$PMTK104*37",
GPS_COLD = "$PMTK103*30",
GPS_WARM = "$PMTK102*31",
GPS_HOT = "$PMTK101*32"
} gps_start_mode;
这样我就可以拥有一个函数来检查 gps_start_mode 的类型并且还具有它需要的值。然而,c 似乎需要枚举值的整数常量。
void configureStartMode(gps_start_mode mode) {
gpsWrite(mode);
}
我想知道它们是否是我可以用来代替此处枚举的其他类似枚举的类型。
否则,我似乎需要一个单独的数组来保存字符串值,这不是很麻烦,但也不理想。
最佳答案
我通常这样做的方式是有一个 const char *
数组,其中包含与枚举中的元素相对应的字符串。
这种方法的问题是两个数据结构很容易变得不同步,例如,如果添加了一个新的枚举元素,但字符串数组没有更新。
为了对此提供一些防御措施,我向 enum
添加了一个额外的元素,它提供了枚举中元素的数量。如果字符串数组具有 static
存储,则任何未显式设置的元素将自动设置为 NULL
。因此,如果字符串数组与枚举不同步,您至少可以断言数组中的最后一个元素是非 NULL,从而导致程序立即终止。
代码示例:
#include <stdio.h>
#include <assert.h>
typedef enum gps_start_mode_
{
GPS_FULL_COLD,
GPS_COLD,
GPS_WARM,
GPS_HOT,
gps_num_start_modes
}
gps_start_mode;
const char *start_mode_to_string[gps_num_start_modes] =
{
"$PMTK104*37",
"$PMTK103*30",
"$PMTK102*31",
"$PMTK101*32"
};
int main(int argc, const char *argv[])
{
assert(start_mode_to_string[gps_num_start_modes - 1] != NULL);
printf("Start mode %d is %s\n", GPS_HOT, start_mode_to_string[GPS_HOT]);
return 0;
}
关于c 替代字符串枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25631221/