为 C 中的嵌套结构指针生成代码
Generate code for nested struct pointers in C
我有一堆嵌套结构,里面有指向数组的指针。
我需要一个工具来生成指向的数据类型的(代码)实例。
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;
...
我知道如何手动创建实例,但想要 script/tool 来执行此操作。
我不能使用 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}
};
这些定义是我想要自动生成的。
由于您不能使用 malloc()
系列函数,因此您必须需要全局变量或堆栈分配的局部变量。对于您提出的相当简单的案例,您可以像这样半自动地完成它:
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()
的代码,无论是否具有运行时初始化函数,例如我提供的。
我有一堆嵌套结构,里面有指向数组的指针。 我需要一个工具来生成指向的数据类型的(代码)实例。
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;
...
我知道如何手动创建实例,但想要 script/tool 来执行此操作。
我不能使用 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}
};
这些定义是我想要自动生成的。
由于您不能使用 malloc()
系列函数,因此您必须需要全局变量或堆栈分配的局部变量。对于您提出的相当简单的案例,您可以像这样半自动地完成它:
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()
的代码,无论是否具有运行时初始化函数,例如我提供的。