【问题标题】:Generate code for nested struct pointers in C为 C 中的嵌套结构指针生成代码
【发布时间】:2015-04-13 20:55:32
【问题描述】:

我有一堆嵌套结构,里面有指向指针的数组。 我需要一个工具来生成指向数据类型的(代码)实例。

typedef stuct
{
    TYPE_1  * data[5];
    int a;
}TOP_T;

typedef struct
{
    TYPE_2 * pToType1Array[2];
    char c;
}TYPE_1;

typedef struct
{
    int b;
}TYPE_2;

要正确使用这两种类型,我需要创建总共 10 个 TYPE_2 实例 - 因为 5*2 - 和 2 个 TYPE_1 实例,然后将指针分配给这些实例。

TYPE_2 t2_0;
TYPE_2 t2_1;

TYPE_1 t1_0;
TYPE_1 t1_1;
TYPE_1 t1_2;
TYPE_1 t1_3;
TYPE_1 t1_4;

TOP_T first;

first.data[0] = &t1_0;
first.data[1] = &t1_1;
...

我知道如何手动创建实例,但想要一个脚本/工具来执行此操作。

我不能使用 malloc。

我使用的是 Eclipse,所以我可以访问类型树。

现在,我必须这样做

/********* ST_CHRONO_TRACE_CONTEXT_T - one for each CHRONO_NUM_TRACE_CONTEXTS per CHRONO_NUM_SESSION_CONTEXTS session */
ST_CHRONO_TRACE_CONTEXT_T   CHRONO_TraceContext_0_0;
ST_CHRONO_TRACE_CONTEXT_T   CHRONO_TraceContext_0_1;
ST_CHRONO_TRACE_CONTEXT_T   CHRONO_TraceContext_1_0;
ST_CHRONO_TRACE_CONTEXT_T   CHRONO_TraceContext_1_1;
ST_CHRONO_TRACE_CONTEXT_T * CHRONO_TraceContext_PTRS[CHRONO_NUM_SESSION_CONTEXTS][CHRONO_NUM_TRACE_CONTEXTS] =
{
    {&CHRONO_TraceContext_0_0, &CHRONO_TraceContext_0_1},
    {&CHRONO_TraceContext_1_0, &CHRONO_TraceContext_1_1}
};

这些定义是我想要自动生成的。

【问题讨论】:

  • auto-generate 是什么意思?您可以使用malloc 系列,从堆栈或全局变量构建。您不能从外部创建对象。
  • 我的意思是自动生成代码,文本。我不允许使用 malloc。 @holgac
  • 这里有一些解决方案: 1. 做一次,复制粘贴。 2.在像Visual Studio这样的IDE中编写脚本,让您可以访问语法树。

标签: c struct auto-generate


【解决方案1】:

由于您不能使用malloc()-family 函数,您必须需要全局变量或堆栈分配的局部变量。对于您提出的相当简单的案例,您可以像这样半自动地完成它:

TYPE_2 twos[10] = {0};
TYPE_1 ones[5] = {{0}};
TOP_T top = {{0}};

static init_pointers() {
    int i, j;
    for (i = 0; i < 5; i += 1) {
        top.data[i] = ones + i;
        for (int j = 0; j < 2; j++) {
            ones[i].pToType1Array[j] = twos + (i * 2 + j);
        }
    }
}

/* ... */

    init_pointers();

您也可以扩展这样的函数以通过算法填充非指针成员。但是,如果您确实需要以编程方式生成 C 源代码,那么您可能需要编写自己的工具来执行此操作。这样的工具可以使用类似的方法(指向数组元素的指针)来生成不依赖于malloc() 的代码,无论有没有运行时初始化函数,例如我提供的。

【讨论】:

  • 这就是我现在的做法,但正如您所猜到的,我的实际问题有更多嵌套级别和指向数组的指针。我希望在某个地方有人知道的工具。这绝对属于代码生成领域。
  • 即便如此,为您生成这些的工具的代码可能比用于执行初始化的函数的代码更复杂。如果您需要为多个源文件生成类似但不同的声明,或者如果声明基于某种可能会更改的外部数据,则代码生成器可能有意义,但否则我建议您坚持使用您的内容现在重新做。正如我所说,如果你确实想要一个代码生成器,那么你可能需要编写它。
  • 我不关心初始化。这是我想要自动化的全局/静态数据结构的生成。 @约翰·布林格
  • @John,我不明白。如果您不关心初始化,那么您实际上想要生成什么? struct 声明? (基于什么?)声明适当大小的 struct 类型数组?
  • 是的结构声明。这是我现在必须手动做的事情:(见原帖)
猜你喜欢
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多