【发布时间】: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 自动生成(成员名称 = 元素名称) -
您真的不需要宏定义末尾的分号,因为您最终会在结构定义中连续使用两个分号。