【发布时间】:2021-12-27 07:26:40
【问题描述】:
我想用函数替换对象字段访问,以简化我正在构建的程序分析器。有没有一种简单的方法可以做到这一点?我用我自己的set 和get 函数想出了以下技巧:
struct Foo
{
int f1;
int f2;
};
// convert v = t->f1 to v = (int)get(t, "f1")
void * get (struct Foo * t, char * name)
{
if (!strcmp(name, "f1")) return t->f1;
else if (!strcmp(name, "f2")) return t->f2;
else assert(0);
}
// convert t->f1 = v; to set(t, "f1", v)
void set (struct Foo * t, char * name, void * v)
{
if (!strcmp(name, "f1")) t->f1 = (int)v;
else if (!strcmp(name, "f2")) t->f2 = (int)v;
else assert(0);
}
编辑:C 或 C++ hack 会起作用。
【问题讨论】:
-
C++ 和 C 在技术上是不同的语言。所以请选择你想要的语言。
-
你想用哪种语言来做这件事?请注意,如果您标记了一种以上的语言并且没有清楚地解释原因,一些其他有用的用户会分心。
-
另外,与其使用单个函数来处理 get 和 set,不如为每个成员设置单独的函数,例如 get_f1() 和 set_f1()。
-
你 a) 试图找到编写程序的方法,以便分析器更轻松地完成工作 b) 试图将基于解析器的语言概念引入编译语言 c) 忽略 C 的差异和 C++。我认为这三个都是无益的设计决策。我建议重新设计,也许在研究了meta.stackexchange.com/questions/66377/what-is-the-xy-problem的概念之后
-
程序分析器不需要在自己的结构中查找成员名称。它可能需要在它正在分析的程序结构中查找成员名称。它将使用在解析结构声明时构造的成员名称映射来实现这一点,并且它可以使用哈希表、各种类型的树或其他方法来实现映射。