我应用 X-macro 机制来获得枚举到字符串的关系。
#define CMD_TABLE \
X(cmd_A)\
X(cmd_B)\
////////////////////////////////////
typedef enum
{
EMPTY,
#define X(x) x,
CMD_TABLE
#undef X
}cmd_t;
////////////////////////////////////
const static struct
{
char* name;
cmd_t index;
} conversionMap[] = {
#define X(x) {#x, x},
CMD_TABLE
#undef X
};
然后,此函数将字符串转换为枚举。
cmd_t str2enum(const char* str);
最后,通过将枚举视为数组的索引来调用相应的函数。
(*func[index])();
这种方法有一个很大的问题是它迫使程序员记住枚举到函数的映射关系。
也就是说,在初始化阶段,以下函数的顺序
void (*func[])(void) =
{
&cmd_A_function,
&cmd_B_function,
};
需要与 的相同CMD_TABLE
。
此外,一旦CMD_TABLE
增长,代码的维护就会变得越来越糟糕,因为
如果命令不支持,人们可能会删除函数指针数组中的错误行。
如果我想知道做
cmd_Z
什么,我必须从 1 数到 26。列表
CMD_TABLE
和void (*func[])(void)
将彼此远离,因此程序员需要在两个地方编写代码才能添加一个功能。