【发布时间】:2017-04-12 16:53:22
【问题描述】:
我正在阅读这篇文章 (Struct iteration through (ab)use of the preprocessor),其中作者使用 x-macros 和 offsetof 将元数据添加到结构中,这将允许其成员轻松序列化、按名称访问等。但这只是实现对于原始结构元素。
是否也可以将其扩展为包含嵌套结构的结构? IE。允许对以下内容进行简单的反序列化的东西:
struct some_struct {
int x, y, z;
};
struct data {
int number;
struct some_struct something;
};
我注意到作者在一开始就这样说:
在这个阶段,结构仅由原始元素(int、float、char 等)组成。 处理嵌套结构、联合、位域和指针需要额外的工作(这可能是未来帖子的主题)。
使用 C 预处理器可以实现这样的事情吗?
(澄清)
为了更清楚,我想看看是否有一种方法可以让我:
a) 定义struct,并且
b) 为文本序列化/反序列化创建元数据
如果可能,一步完成。
【问题讨论】:
-
嗯,“递归”和“宏”永远不会一起工作。
-
@EugeneSh.: 嗯,我知道有办法得到像list "iteration" 这样的东西,所以这个标题可能有误导性。
-
括号错误。它应该是“abuse”。这是一个 XY 问题,使用代码生成来完成这个。这样的代码最终会让你陷入调试的宏地狱。
-
@Olaf:你知道有一个工具可以为 C 生成一组带有文本反序列化器的结构吗?我发现的大多数东西都与 C++ 模板有关。
-
@étale-cohomology:我们最终使用了协议缓冲区,他们的工具从 .proto 文件生成结构和序列化代码。我们还为其他事情使用了一些代码生成,而不是 xmacros,因为当您可以在调试时打开、查看和逐步执行实际的 .c/.h 文件时,它使每个人的生活变得更加轻松。通过宏进行调试是一件非常痛苦的事情,而代码生成使您可以做的事情比仅使用宏所能做的多得多
标签: c reflection macros preprocessor x-macros