我已经定义了一些这样的宏:
#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 :(得分: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所示。