【问题标题】:implement field access with functions用函数实现字段访问
【发布时间】:2021-12-27 07:26:40
【问题描述】:

我想用函数替换对象字段访问,以简化我正在构建的程序分析器。有没有一种简单的方法可以做到这一点?我用我自己的setget 函数想出了以下技巧:

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的概念之后
  • 程序分析器不需要在自己的结构中查找成员名称。它可能需要在它正在分析的程序结构中查找成员名称。它将使用在解析结构声明时构造的成员名称映射来实现这一点,并且它可以使用哈希表、各种类型的树或其他方法来实现映射。

标签: c++ c


【解决方案1】:

所以,据我了解,您正在寻找一些用于 c/c++ 的反射库? 在这种情况下,c 和 c++ 之间存在相当大的差异。

对于 C++,您可以使用 boost describe

对于 C 有几个库,所有解决方案的底线都归结为使用宏定义您的结构,例如:

MY_STRUCT(s,
MY_MEMBER(int, y),
MY_MEMBER(float, z))

你可以看几个例子here

【讨论】:

    猜你喜欢
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多