我真的希望我可以使用枚举如下
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);
}
我想知道他们是否是其他类似枚举的类型,我可以在这里用来代替枚举。
否则,我似乎需要一个单独的数组来保存字符串值,这不是一个很大的麻烦但不理想。
答案 0 :(得分:2)
我通常这样做的方法是让一个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;
}
答案 1 :(得分:0)
您可以根据需要使用#define指令。枚举不是解决方案。 对于#define指令。例如
#define key1 value1
#define key2 value2
int main(void){
//your code here
and remember all keys replaces their respecive value
}
您甚至可以在两者之间定义宏,但关键是您只能在其定义之下使用它。