有没有一种简单的方法将值转换为字符串?

时间:2017-06-19 16:11:01

标签: c

我已经定义了一些这样的宏:

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

有没有简单的方法呢?

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:1)

你所拥有的已经是一种常见的方式。我建议保持这种方式,实际上在<{1}}语句中使用你的宏而不是魔术字符

如果您的值是连续的,您还可以使用这样的查找表:

case

这两种方法都假设函数永远不会被无效参数调用。

如果您可以将事件的值更改为自然数,例如

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]定义匹配表,如this answer所示。