gpt4 book ai didi

c++ - 显示枚举值名称的通用方法

转载 作者:可可西里 更新时间:2023-11-01 18:35:07 28 4
gpt4 key购买 nike

有没有办法显示枚举值的名称?假设我们有:

enum fuits{
APPLE,
MANGO,
ORANGE,
};

main(){
enum fruits xFruit = MANGO;
...
printf("%s",_PRINT_ENUM_STRING(xFruit));
...
}

使用预处理器

#define _PRINT_ENUM_STRING(x) #x

将不起作用,因为我们需要获取变量“x”的值,然后将其转换为字符串。这在 c/C++ 中完全可行吗?

最佳答案

您可以使用预处理器来执行此操作,我相信这种技术称为 X-Macros :

/* fruits.def */
X(APPLE)
X(MANGO)
X(ORANGE)

/* file.c */
enum fruits {
#define X(a) a,
#include "fruits.def"
#undef X
};

const char *fruit_name[] = {
#define X(a) #a,
#include "fruits.def"
#undef X
};

请注意,最后一个条目包含一个尾随逗号,这在 C99 中是允许的(但在 C89 中是不允许的)。如果这是一个问题,您可以添加重要值。也可以通过为自定义名称或枚举值等提供多个参数来使宏更复杂:

X(APPLE, Apple, 2)
#define X(a,b,c) a = c, /* in enum */
#define X(a,b,c) [c] = #b, /* in name array */

限制:您不能有负常量,并且您的数组是 sizeof (char *) * largest_constant 但是您可以通过使用额外的查找表来解决这两个问题:

int map[] = {
#define X(a,b,c) c,
#include "fruits.def"
#undef X
};

<罢工>

这当然行不通。起作用的是生成一组额外的 enum 常量作为名称的键:

enum fruits {
#define X(a,b,c) a ## _KEY,
#include "fruits.def"
#undef X
#define X(a,b,c) a = c,
#include "fruits.def"
#undef X
};

现在您可以使用 fruit_name[PINEAPPLE_KEY] 找到 X(PINEAPPLE, Pineapple, -40) 的名称。

人们注意到他们不喜欢额外的包含文件。您不需要这个额外的文件,您还可以使用 #define。这可能更适合小型列表:

#define FRUIT_LIST X(APPLE) X(ORANGE)

并将前面示例中的#include "fruits.def替换为FRUIT_LIST

关于c++ - 显示枚举值名称的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3455952/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com