c - 如何将 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
增长,代码的维护就会变得越来越糟糕,因为
如果命令不支持,人们可能会删除函数指针数组中的错误行。
如果我想知道做
cmd_Z
什么,我必须从 1 数到 26。列表
CMD_TABLE
和void (*func[])(void)
将彼此远离,因此程序员需要在两个地方编写代码才能添加一个功能。
解决方案
您已经使用过两次 X-macro。
您可以第三次使用它。
这是一个如何做到这一点的建议,使用你前两次应用的丑陋的 undef-using 模式:
void (*func[])(void) =
{
#define X(x) &x##_function,
CMD_TABLE
#undef X
};
推荐阅读
- python - 在 Google Colab 中使用 TPU
- python - 如何获取字典中特定键的计数
- css - Vuetify 右侧的 v-text-field 标签
- c# - C#泛型类:从可空类型参数推断不可空类型
- powershell - Powershell:通过邮件查找由一个人管理的所有帐户
- c++ - 为什么 C++ 模板实例化失败?
- python - 读取grb2文件很慢
- javascript - 如何将此网址替换为我想要的格式ID,谢谢
- javascript - useContext 未在子组件中显示更新的状态(当从全局文件中的 useEffect 挂钩中的 firebase 检索数据时)
- rx-java - 当项目在不同的线程中出现时,Rxjava observable somtimes 会错过一些项目