【发布时间】:2018-04-14 08:57:17
【问题描述】:
我有很多预处理宏定义,像这样:
#define FOO 1
#define BAR 2
#define BAZ 3
在实际应用中,每个定义对应一个解释器虚拟机中的一条指令。宏的编号也不是连续的,以便为将来的指令留出空间;可能有一个#define FOO 41,那么下一个是#define BAR 64。
我现在正在为此虚拟机开发调试器,并且需要有效地“反转”这些前驱宏。换句话说,我需要一个函数,它接受 number 并返回 macro name,例如输入 2 会返回 "BAR"。
当然,我可以自己使用switch 创建一个函数:
const char* instruction_by_id(int id) {
switch (id) {
case FOO:
return "FOO";
case BAR:
return "BAR";
case BAZ:
return "BAZ";
default:
return "???";
}
}
然而,这将是一场噩梦,因为重命名、删除或添加指令也需要修改此函数。
是否有另一个宏可以用来为我创建这样的函数,或者有其他方法吗?如果没有,是否可以创建一个宏来执行此任务?
我在 Windows 10 上使用 gcc 6.3。
【问题讨论】:
-
只是检查一下,是否有必要使用预处理器宏而不是某种数据结构来执行此操作?
-
@DavidZ 我当然愿意接受不同的处理方式;如果有比预处理器宏更好的方法,那么我很乐意使用它。
-
我真的很惊讶您从未学习过元编程方法(至少以解析器生成器或compiler compiler 为例)。你在哪里学过 C 语言?
-
关注(当你有时间的时候)我回答中的所有链接。在某些时候,您需要了解所有这些。见norvig.com/21-days.html
-
@BasileStarynkevitch 会的,谢谢。 (在一个不相关的说明中,尽管我会让你知道你的简历中指向 GCC MELT 的链接已损坏。)
标签: c gcc c-preprocessor