如果我要在switch语句中比较这些枚举值。编号字符串的目的是什么?
如果我将枚举存储在头文件中,然后导入头文件。我知道我可以说事件事件= ls; (我可以将ls存入事件中)
但我可以说像event [0]这样的东西来访问ls吗?
cvs add -kb <unicode-file>
答案 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));
之类的操作来打印事件的名称。
没有这样的功能。