【问题标题】:Accessing struct member name in C using Macros使用宏访问 C 中的结构成员名称
【发布时间】:2013-10-31 13:01:12
【问题描述】:

我在 C 中使用宏时遇到了一些问题。我需要访问结构成员的名称。我从这个链接HERE!!! 找到了 C++ 的解决方案。现在我正在尝试将它翻译成 C,但我不能在 struct 中使用该函数。 这是我唯一能做的:

typedef struct ms ms;
struct ms{
#define SM(y, z) z y;
SM(author, char*);
SM(title, char*);
SM(year, int);
void (*set)(char* fname, char* val);
#undef SM
};

然后,函数:

void set(char* fname, char* val)
{
   //code
}

但是我不知道我应该如何在函数中填写代码以获得与我之前提到的链接相同的解决方案。我需要帮助:(有人吗?

【问题讨论】:

  • 我想说该链接中提到的所有内容都属于“非常糟糕的做法,永远不要这样做”的类别。用宏重新发明编程语言总是一个非常糟糕的主意。由于不存在类型安全,它不仅非常容易出错,而且对于其他程序员来说也是一个难以理解的混乱。其他程序员知道 C,他们不知道“Bob 的私有小宏语言”。
  • 另外,如果你只知道函数指针,你可以用一种更好更简洁的方式来实现 my_struct.set_var() 。或者更好的是,基于不完全类型设计 C 模块,本质上是面向对象设计的 C 版本。
  • 您要解决的原始问题是什么?
  • @Lundin 哇,感谢您提供的信息。我真的不知道这件事。我昨天才发现宏,因为我发现那个链接看起来很适合我的问题。实际上,我需要将 XML 文件(不是 XSD)自动转换为 C 结构。我已经发布了一个关于它的问题,但还没有解决。我的想法是,如果我可以使用字符串示例通过其名称访问结构成员:set("author","John"); 我可以自动转换它(如果 XML 元素名称更改,我不必更改代码),因为生成了结构也由 gSOAP 自动生成(成员名称 = 元素名称)
  • 您真的不需要宏定义末尾的分号,因为您最终会在结构定义中连续使用两个分号。

标签: c++ c macros struct


【解决方案1】:

必须使用strcpy 复制字符串。因此,author 字段将被填充为

struct ms myvar;

#define setstr(author,val) strcpy ( (myvar.author), val )

int 可以定期分配

#define setint(year,val) myvar.year=val

【讨论】:

  • 谢谢,这在某种程度上给了一些灵感,但我需要通过字符串访问(在主函数中)成员。就像set("author","John"); 这样的东西。
  • 然后,您必须修改宏以识别您正在尝试修改字段 "author",然后修改 myvar.author 或您尝试的任何其他字段。
  • 是的,我知道,但是实现它对我来说有点混乱。我刚刚在 2-3 天前发现了宏。我对此一无所知。它的工作原理有点令人困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
相关资源
最近更新 更多