gpt4 book ai didi

c 替代字符串枚举

转载 作者:太空宇宙 更新时间:2023-11-04 08:37:28 26 4
gpt4 key购买 nike

我真的希望我可以像下面这样使用枚举

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com