Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c字符串枚举的替代方法_C_String_Enums - Fatal编程技术网

c字符串枚举的替代方法

c字符串枚举的替代方法,c,string,enums,C,String,Enums,我真的希望我可以使用enum的如下 typedef enum { GPS_FULL_COLD = "$PMTK104*37", GPS_COLD = "$PMTK103*30", GPS_WARM = "$PMTK102*31", GPS_HOT = "$PMTK101*32" } gps_start_mode; 因此,我可以有一个功能,类型检查的gps_开始_模式,也有它需要的值。然而,c似乎需要整数常量作为枚举值 void configureStartMod

我真的希望我可以使用enum的如下

typedef enum {
    GPS_FULL_COLD = "$PMTK104*37",
    GPS_COLD = "$PMTK103*30",
    GPS_WARM = "$PMTK102*31",
    GPS_HOT = "$PMTK101*32"
} gps_start_mode;
因此,我可以有一个功能,类型检查的gps_开始_模式,也有它需要的值。然而,c似乎需要整数常量作为枚举值

void configureStartMode(gps_start_mode mode) {
    gpsWrite(mode);
}
我想知道他们是否是其他类似enum的类型,我可以在这里用它来代替enum

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

您可以根据需要使用#define指令。枚举不是解决方案。 对于#定义指令。例如

#define key1 value1
#define key2 value2

int main(void){

  //your code here

  and remember all keys replaces their respecive value

}

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

我通常这样做的方式是使用一个包含与枚举中的元素对应的字符串的
常量char*
数组

这种方法的问题是,这两个数据结构很容易变得不同步,例如,如果添加了一个新的枚举元素,但字符串数组没有更新

为了对此提供一些防御,我向
枚举添加了一个额外的元素,它提供枚举中的元素数。如果字符串数组具有
静态
存储,则任何未显式设置的元素将自动设置为
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;
}
#包括
#包括
typedef枚举gps_启动_模式_
{
全球定位系统充满寒冷,
你很冷,
温暖,
全球定位系统热,
gps\u数量\u启动\u模式
}
gps_启动_模式;
const char*start\u mode\u到字符串[gps\u num\u start\u modes]=
{
“$PMTK104*37”,
“$PMTK103*30”,
“$PMTK102*31”,
“$PMTK101*32”
};
int main(int argc,const char*argv[]
{
断言(启动模式到字符串[gps\U num\U启动模式-1]!=NULL);
printf(“启动模式%d是%s\n”,GPS_热,启动模式到字符串[GPS_热]);
返回0;
}

通常使用
#define
操作。虽然不那么优雅,但几十年来人们都是这样做的。另一种技术是使用数值
enum
,然后将
enum
值传递给返回相应字符串的方法。使用enum保存数组的索引似乎是最好的解决方案-它很简单,并且可以保持类型检查,这个解决方案的问题是它扼杀了类型检查。我昨天已经走了这么远,但对不同步的问题感到厌倦,我希望进一步将字符串数组定义为:
const char*s_m_t_s[4]然后
s_m_t_s[GPS_COLD]=“$PMTK…”
可以防止重新排列枚举。然而,我还没有找到一种让编译器满意的方法。是的,有一些方法涉及到可变宏。它使您认识到像Swift这样的新语言设计背后的基本原理,其中包括。