有没有简单的方法将值转换为字符串?
我已经定义了一些宏是这样的:有没有简单的方法将值转换为字符串?
#define ABC '1'
#define DEF '2'
#define XYZ '3'
而且我也需要输出宏字符串基于其价值,就像这样:
static const char* get_event_string(unsigned char event)
{
switch (event) {
case '1':
return "ABC";
case '2':
return "DEF";
case '3':
return "XYZ";
}
}
有没有什么简单的方法来做到这一点?
你有什么已经是一种常见的方式来做到这一点。我建议保持这种方式,实际上使用您的宏在case
声明,而不是魔术字符 s。
如果你的价值观是连续的,你也可以使用一个查找表是这样的:
static const char *get_event_string(unsigned char event)
{
static const char *const names[] = {
"ABC",
"DEF",
"XYZ"
};
return names[event - '1'];
}
两种方法假定函数永远不会调用的参数无效。
如果您可以将事件的值更改为自然数,例如,
#define ABC 1
#define DEF 2
#define XYZ 3
,或者甚至使用enum
:
enum event
{
EV_NONE,
EV_ABC,
EV_DEF,
EV_XYZ
};
然后查找表才会有真正的好处是,你不需要任何的功能更多。只需把它定义(如对上述enum
为例):
const char *const event_strings[] = {
"EV_NONE",
"EV_ABC",
"EV_DEF",
"EV_XYZ"
};
和所有您需要在代码中写访问的名字是event_strings[event]
。
做这这方式甚至使您可以使用预处理程序自动定义匹配的表到您的enum
像显示在this answer。
一定要先看看这个罚款答案:How to convert enum names to string in c
如果基于各种常数不符合您的需求,计算的指数。
如果常量ABC,DEF,XYZ
是唯一的,任意的(例如,也许不是连续的),并固定在恒定计数(3),可以使用一个公式,并让编译器优化。
const char* get_event_string(unsigned char event) {
int index = (event == ABC)*1
| (event == DEF)*2
| (event == XYZ)*3;
static const char *event_string[4] = { "None", "ABC", "DEF", "XYZ" };
return event_string[index];
}
嗯,当然这比让编译器优化'switch .. case'更好吗?我觉得它不太可读,但这可能是一个品味问题。 –
@FelixPalmen好点。没有提示在发射代码中这比“switch .. case”更好。根据OP的需要,这可以将'event_string []'作为一个可能更容易维护的数组。当然可以编写'case'1':return event_string [1]; case'2': return event_string [2]; ...... IMO最好的代码是清晰的,使用'switch ... case'通常足够清晰,但OP的需求可能与我的经验不同。 – chux
不应该担心10-20个字符串,但不会记录(n)范围比较优于n个相等性检查吗? –
看起来很简单。你试图达到什么目的? – Yunnosch
你为什么在你的case语句使用''1''当你有完全可用'#define''d标签设置? –
足够关闭,如果你不介意使用枚举代替:https://stackoverflow.com/questions/9907160/how-to-convert-enum-names-to-string-in-c – HolyBlackCat