首页 > 解决方案 > 如何将 X 宏与函数指针数组相关联

问题描述

我应用 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增长,代码的维护就会变得越来越糟糕,因为

  1. 如果命令不支持,人们可能会删除函数指针数组中的错误行。

  2. 如果我想知道做cmd_Z什么,我必须从 1 数到 26。

  3. 列表CMD_TABLEvoid (*func[])(void)将彼此远离,因此程序员需要在两个地方编写代码才能添加一个功能。

标签: cc-preprocessorfunction-pointersx-macros

解决方案


您已经使用过两次 X-macro。
您可以第三次使用它。
这是一个如何做到这一点的建议,使用你前两次应用的丑陋的 undef-using 模式:

void (*func[])(void) = 
{
#define X(x) &x##_function,
    CMD_TABLE
#undef X
};

推荐阅读