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

时间:2017-10-12 22:44:08

标签: c enums

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

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

但我可以说像event [0]这样的东西来访问ls吗?

 cvs add -kb <unicode-file>

4 个答案:

答案 0 :(得分:1)

没有枚举字符串这样的东西。您所谈论的是标识符,仅在源代码中使用。 C中的enum表示为整数类型,通常为int,但编译器可以自由选择,例如short或另一个。甚至允许enum保存与其中一个命名成员不对应的值。只有这些数字才能进入已编译的程序中。 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(不要重复自己)原则:更改enum时,您必须触摸代码中的两个不同位置,这是潜在错误的来源。有时使用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" ,
    };
    

答案 1 :(得分:0)

您可以从整数转换为枚举,如果枚举是从零开始的密集序列,则相当于索引。通常,枚举只是为相关常量列表引入符号名称的一种方法。它在语法上比使用#define更好,但除此之外几乎没有什么功能。如果未明确分配数字,编译器将管理为每个成员分配唯一值。但即使找到最大值也不是语言提供的东西,更不用说将字符串映射为字符串或类似字符。

答案 2 :(得分:0)

如果你真的想使用event[0],你可以这样做:

events event[11];
event[0] = ls;
event[1] = rs;
event[2] = ws;
event[3] = lo;
event[4] = ro;
event[5] = lc;
event[6] = rc;
event[7] = gru;
event[8] = grl;
event[9] = gll;
event[10] = glu;

我会说,但我确信有一种解决办法(因为它根本不优雅),如果你给出更多的背景:)

编辑:重新阅读你的问题后,我得到了你想要STRING&#34; ls&#34;从你的枚举?

如果是这样,那么你就无法做到这一点。枚举类型非常适合switch语句,但如果您尝试通过代码将变量名称转换为字符串而不进行硬编码event[0] = "ls",则不会发生这种情况。

答案 3 :(得分:0)

我想您正在询问如何将事件的名称作为事件中的字符串获取,以便您可以执行printf("%s\n", SOMEFUNCTION(event));之类的操作来打印事件的名称。

没有这样的功能。