gpt4 book ai didi

c - 拥有枚举字符串值的好方法

转载 作者:行者123 更新时间:2023-12-04 07:54:23 26 4
gpt4 key购买 nike

我发现自己在 C 中做了很多以下模式:

enum type {String, Number, Unknown};

const char* get_token_type(int type) {
switch (type) {
case String: return "String";
case Number: return "Number";
default: return "Unknown";
}
}
是否有任何不错的选择可以将两者合二为一?

这是另一种方式,它使用全局并且不确定它有多“干净”,但至少我可以在一次复制粘贴工作中将所有内容设置在顶部。
enum type                {String,  Number,   Unknown};
char type_string[][40] = {"String", "Number","Unknown"};

const char* get_token_type(int type) {
return type_string[type];
}

最佳答案

丑陋而缓慢的switch解决方案应替换为可读的查找表:

const char* const type_string[] = {"String", "Number","Unknown"};

typedef enum {String, Number, Unknown, type_size} type;

...
type something = ...;
if(something > 0 && something<type_size)
puts( type_string[something] );
一个不太推荐但可能的解决方案是“X 宏”。它们难以阅读,主要用于当您无法更改正在维护的程序时,以便将所有数据集中到程序中的一个位置。
它看起来像这样:
#include <stdio.h>

#define TYPE_LIST(X) \
X(String) \
X(Number) \
X(Unknown) \

typedef enum
{
#define X(x) x,
TYPE_LIST(X)
#undef X
type_size
} type;

const char* const type_string[] =
{
#define X(x) [x] = #x, // array designated initializer using enum constant as index
TYPE_LIST(X)
#undef X
};

_Static_assert(sizeof type_string/sizeof *type_string == type_size,
"type and type_string mismatch");

int main (void)
{
printf("%d %d %d\n", String, Number, Unknown);
printf("%s %s %s\n", type_string[String],
type_string[Number],
type_string[Unknown]);

// or if you really like X macros...
#define X(x) printf("%d is %s\n", x, #x);
TYPE_LIST(X)
#undef X
}
(这仅适用于标准 C,而不适用于 C90,因为 C90 中枚举语言缺陷中的尾随逗号)

关于c - 拥有枚举字符串值的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66776113/

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