2017-06-19 164 views
-2

我已经定义了一些宏是这样的:有没有简单的方法将值转换为字符串?

#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"; 
    } 
} 

有没有什么简单的方法来做到这一点?

+0

看起来很简单。你试图达到什么目的? – Yunnosch

+2

你为什么在你的case语句使用''1''当你有完全可用'#define''d标签设置? –

+0

足够关闭,如果你不介意使用枚举代替:https://stackoverflow.com/questions/9907160/how-to-convert-enum-names-to-string-in-c – HolyBlackCat

回答

1

你有什么已经是一种常见的方式来做到这一点。我建议保持这种方式,实际上使用您的宏在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

+0

冗余太多,容易出错。最少的是为阵列使用指定的初始值。而且,因为您已经使用函数来检索数据,所以将表移动到函数范围并将表本身设为const也会更好。 – Olaf

+0

嗯,我不会在我的代码中使用*数字字符*作为ID,首先。也许我会编辑这个以显示(恕我直言)最好的方式,当你只使用自然数作为ID ... –

+0

是的,这是whatr'enum's通常是好的。 – Olaf

2

一定要先看看这个罚款答案: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]; 
} 
+0

嗯,当然这比让编译器优化'switch .. case'更好吗?我觉得它不太可读,但这可能是一个品味问题。 –

+0

@FelixPalmen好点。没有提示在发射代码中这比“switch .. case”更好。根据OP的需要,这可以将'event_string []'作为一个可能更容易维护的数组。当然可以编写'case'1':return event_string [1]; case'2': return event_string [2]; ...... IMO最好的代码是清晰的,使用'switch ... case'通常足够清晰,但OP的需求可能与我的经验不同。 – chux

+0

不应该担心10-20个字符串,但不会记录(n)范围比较优于n个相等性检查吗? –

相关问题