2014-09-02 93 views
0

我真的很希望我能如下C的第二到枚举字符串

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); 
} 

我想知道如果他们是一些其他枚举类型我可以在这里使用enum的地方。

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

+4

一般来说,'#define'操作来代替。虽然不够优雅,但几十年来,人们一直在这样做。另一种技术是使用数字enum,然后将enum值传递给返回相应字符串的方法。 – 2014-09-02 19:51:31

+3

使用枚举来保存索引到一个数组似乎是最好的解决方案 - 它很简单,并保持类型检查,成本不是太多的样板。 – Frax 2014-09-02 19:58:38

回答

2

我通常这样做的方式是让一个const char *的数组包含对应于枚举中元素的字符串。

这种方法的问题是,两个数据结构很容易失去同步,例如,如果添加了新的枚举元素,但字符串数组未更新。

为了提供一些防御,我在enum中添加了一个附加元素,它提供了枚举中元素的数量。如果字符串数组具有static存储空间,则任何未明确设置的元素将自动设置为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; 
} 
+0

昨天我得到了这个,但我厌倦了不同步的问题,我希望进一步,并将字符串数组定义为:'const char * s_m_t_s [4];'然后's_m_t_s [GPS_COLD] =“ $ PMTK ...“;'这会阻止我重新排列枚举。不过,我还没有找到一种方法来做到这一点,使编译器感到高兴。 – user3817250 2014-09-03 13:17:01

+1

是的,有一些[很可怕的解决方案](http://stackoverflow.com/questions/207976/how-to-easily-map-c-enums-to-strings)这涉及到可变宏。它让你意识到像Swift这样的新语言设计的基本原理,它包括[更强大的枚举支持](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations。 HTML)。 – 2014-09-03 14:00:35

0

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

#define key1 value1 
#define key2 value2 

int main(void){ 

    //your code here 

    and remember all keys replaces their respecive value 

} 

你甚至可以定义宏之间,但问题是,你只能用它的定义如下。

+0

该解决方案的问题在于它杀死了类型检查。 – user3817250 2014-09-03 13:10:12