【问题标题】:Is it possible to (recursively) "introspect" nested C structs using x-macros?是否可以(递归地)使用 x 宏“内省”嵌套的 C 结构?
【发布时间】: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


【解决方案1】:

您所要求的一切都在这里实现https://github.com/alexanderchuranov/Metaresc

这是一个示例应用程序:

#include <metaresc.h>

TYPEDEF_STRUCT (some_struct_t,
                int x,
                int y,
                int z,
                );

TYPEDEF_STRUCT (data_t,
                int number,
                (struct some_struct_t, something),
                );  

int main (int argc, char * argv[])
{
  data_t data = { 1, { 2, 3, 4 } };
  MR_PRINT ("data = ", (data_t, &data));
  return (EXIT_SUCCESS);
}

预期输出:

data = {
  .number = 1,
  .something = {
    .x = 2,
    .y = 3,
    .z = 4
  }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-01-11
  • 2011-08-23
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2016-07-12
  • 2018-12-22
相关资源
最近更新 更多