c - 通过数组表示法访问枚举字符串?

标签 c enums

如果我要在 switch 语句中比较这些枚举值。对字符串进行编号的目的是什么?

如果我将枚举存储在头文件中,然后导入头文件。我知道我可以说 events event = ls; (我可以将 ls 存储到事件中)

但是我可以说类似 event[0] 的东西来访问 ls 吗?

#define NUM_EVENTS 11
typedef enum events {
    ls = 0,
    rs = 1,
    ws = 2,
    lo = 3,
    ro = 4,
    lc = 5,
    rc = 6,
    gru = 7,
    grl = 8,
    gll = 9,
    glu = 10
} events;

最佳答案

不存在枚举字符串这样的东西。您所说的是标识符,仅在源代码中使用。 C 中的 enum 表示为整数类型,通常为 int,但编译器可以自由选择,例如short 或其他。枚举甚至可以保存与指定成员之一不对应的值。只有这些数字才会出现在编译的程序中。 C 编译器不必(必须)在编译后的可执行文件中存储任何类型信息。

因此,如果您在运行时需要将枚举标识符作为字符串,则必须自己存储它们。这通常看起来像例如

typedef enum events {
    ls,
    rs,
    ws,
    lo,
    ro,
    lc,
    rc,
    gru,
    grl,
    gll,
    glu
} events;

static const char *event_names[] = {
    "ls",
    "rs",
    "ws",
    "lo",
    "ro",
    "lc",
    "rc",
    "gru",
    "grl",
    "gll",
    "glu"
};

void example(event ev)
{
    // might want to check for a valid value here ...

    // print name of event
    puts(event_names[ev]);
}

顺便说一句,无需明确为您的案例中的成员编号 - 默认编号从 0 开始,每个成员加一。

<小时/>

进一步提示:

  • enum 成员标识符是全局的,因此最好使它们唯一,例如通过在前面添加类型名称,如下所示:

    typedef enum events {
        event_ls,
        event_rs,
        // ...
    } events;
    
  • 上面的代码违反了 DRY(不要重复自己)原则:更改枚举时,您必须触及代码中的两个不同位置,这是潜在错误的来源。有时可以使用 X macros 来解决此问题。对于这种风格是好还是坏,存在着不同的意见,为了完整起见,这里仅介绍一下:

    #define EVENTS_LIST \
        X(ls) \
        X(rs) \
        X(ws) \
        X(lo) \
        X(ro) \
        X(lc) \
        X(rc) \
        X(gru) \
        X(grl) \
        X(gll) \
        X(glu)
    
    #define X(name) event_##name ,
    typedef enum events {
        EVENTS_LIST
    } events;
    #undef X
    
    #define X(name) #name ,
    static const char *event_names[] = {
        EVENTS_LIST
    };
    #undef X
    

    经过预处理后,会产生

    typedef enum events {
        event_ls , event_rs , event_ws , event_lo , event_ro , event_lc , event_rc , event_gru , event_grl , event_gll , event_glu ,
    } events;
    
    static const char *event_names[] = {
        "ls" , "rs" , "ws" , "lo" , "ro" , "lc" , "rc" , "gru" , "grl" , "gll" , "glu" ,
    };
    

关于c - 通过数组表示法访问枚举字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46719980/

相关文章:

c - 如何在 Visual Studio 2012 中使用枚举

c - 为什么在使用 snprintf 时会出现此代码的段错误?

c - 错误 : initializer element is not a compile-time constant from initializing a structure of known size this is C

c++ - 为枚举结构设置多个属性

c++ - 从匿名结构访问枚举条目

c++ - C++ 中的枚举类型是跨平台的吗?

c++ - 如何将枚举类传递给 QML?

objective-c - Ruby 1.8.7 中的 Ruby 字符串编码

c - 如何将整数转换为其 32 位二进制等值

c - 如何解决这个指针问题?