是否有可能将枚举数名称转换为C语言中的字符串?

推荐答案

一种方法是让预处理器来做这项工作.它还可以确保枚举和字符串同步.

#define FOREACH_FRUIT(FRUIT) \
        FRUIT(apple)   \
        FRUIT(orange)  \
        FRUIT(grape)   \
        FRUIT(banana)  \

#define GENERATE_ENUM(ENUM) ENUM,
#define GENERATE_STRING(STRING) #STRING,

enum FRUIT_ENUM {
    FOREACH_FRUIT(GENERATE_ENUM)
};

static const char *FRUIT_STRING[] = {
    FOREACH_FRUIT(GENERATE_STRING)
};

预处理器完成后,您将有:

enum FRUIT_ENUM {
    apple, orange, grape, banana,
};

static const char *FRUIT_STRING[] = {
    "apple", "orange", "grape", "banana",
};

然后你可以这样做:

printf("enum apple as a string: %s\n",FRUIT_STRING[apple]);

如果用例实际上只是打印枚举名称,请添加以下宏:

#define str(x) #x
#define xstr(x) str(x)

然后做:

printf("enum apple as a string: %s\n", xstr(apple));

在这种情况下,两级宏似乎是多余的,但是,由于严格化在C中的工作方式,在某些情况下是必要的.例如,假设我们希望使用#define和enum:

#define foo apple

int main() {
    printf("%s\n", str(foo));
    printf("%s\n", xstr(foo));
}

结果将是:

foo
apple

这是因为str将字符串化输入foo,而不是将其扩展为apple.通过使用xstr,首先进行宏扩展,然后将结果字符串化.

更多信息请参见Stringification.

C++相关问答推荐

C中char数组指针的问题

我的C语言中的回归函数如何工作?

为什么静态说明符为内联函数生成外部定义?

Mbed TLS:OAEP的就地en—/decryption似乎不起作用'

常数函数指针优化

当main函数调用被重构时,C函数给出错误的结果

使用额外的公共参数自定义printf

这是一个合法的C Strdup函数吗?

如果我释放其他内容,返回值就会出错

在C中将通用字符名称转换为UTF-8

为什么net/if.h在ifaddrs.h之前?

在C23中使用_GENERIC实现带有右值的IS_POINTER(P)?

为什么cudaFree不需要数据 struct 的地址?

函数内的局部字符指针

`#if`条件中是否允许`sizeof`?

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

用gcc-msse 2编译的C程序包含AVX 1指令

如何使用C++在控制台中以彩色打印被阻止的客户端

C语言中奇怪的输出打印数组

无法将字符串文字分配给 C 中的字符数组