c替换字符串的枚举

时间:2014-09-02 19:48:34

标签: 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);
}

我想知道他们是否是其他类似枚举的类型,我可以在这里用来代替枚举。

否则,我似乎需要一个单独的数组来保存字符串值,这不是一个很大的麻烦但不理想。

2 个答案:

答案 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

}

您甚至可以在两者之间定义宏,但关键是您只能在其定义之下使用它。