c 替代字符串枚举

标签 c string enums

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

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/

相关文章:

java - 将字符串从 Java 发送到 C(套接字)

c# - Javascript C# Unicode 字符串 - headscratcher

r - 如何将字符串中的字母转换为R中的数字

java - 是否可以基于输入文件创建 Java 枚举?

c - 在C语言中,这两个for循环有什么区别吗?

Python:使用 FFTW 加载 DLL 时找不到模块(OSError:[WinError 126])

基于数据类型的 C 编程测验

c - 如何在给定索引的情况下更改字符串中字符的值?

java - 通过常量特定数据在枚举常量中查找

angular - 如何在 Angular @Input 中只接受预定义的值