静态初始化struct self-reference

时间:2011-11-16 22:14:20

标签: c struct

我有一个简单的结构,如下定义:

typedef struct { 
    int index;
    double* arrayToRead;
} my_struct;

我想初始化一个结构数组,使它们变成这样:

double decimals[2] = {1.0, 2.0};

my_struct[2] = {
    {0, &decimals[0]},
    {1, &decimals[1]}
};

我必须静态初始化这个结构数组。

我可以在引用之前定义的成员时静态初始化它,如下所示:

my_struct[2] = {
    {0, &decimals[index]},
    {1, &decimals[index]}
};

其中“index”是指在“decimals”左边定义的index的值?

4 个答案:

答案 0 :(得分:7)

如果你有一个现代的C编译器(又名C99),你可以使用P99进行代码展开。像

这样的东西
#define INIT_ELEMENT(NAME, X, I) [I] = { \
  .index = I,                            \
  .arraytoread = &decimals[I]            \
}
#define INIT_ELEMENTS(N) P99_FOR(, N, P00_SEQ, INIT_ELEMENT, P99_DUPL(N,))

然后

my_struct A[] = { INIT_ELEMENTS(2) };

应扩展为您喜欢的初始化程序。

(这里第一个宏定义了要重复的代码,仅使用其参数中的I,即调用的索引。在第二个宏P00_SEQ中,这意味着用逗号分隔。)

答案 1 :(得分:5)

*

如果你非常绝望,你总是可以为此目的设计一个宏:

#define DEFINE_ELEMENT(i) {(i), &decimals[(i)]}
my_struct m[2] = {
    DEFINE_ELEMENT(0),
    DEFINE_ELEMENT(1)
};
#undef DEFINE_ELEMENT

<小时/> *或&#34;是&#34;,正如@Jens在答案中指出的,C99。

答案 2 :(得分:0)

我认为您需要为新阵列命名

my_struct my_array[2] = {
  {0, &decimals[my_array[0].index]},
  {1, &decimals[my_array[1].index]}
};

答案 3 :(得分:-1)

天空中有什么? 这是一只鸟! 不,这是一架飞机! 不,这是代码生成人!

enter image description here

或者 - 从脸颊上移除舌头 - 我不知道有一个内置功能支持这个,但你总是可以使用外部工具为你编写初始化代码。


基本上你用一种方便的语言编写一个脚本,输出定义结构的ac代码片段并用长手初始化声明变量,然后使用c-preprocessor的#include功能将生成的文件拖到你的身上代码。

您需要让构建管理员了解此需求。在make中它看起来像

cfile.o: cfile.c mystruct.c

my_struct.c:
        awk -f generate_my_struct.awk > my_struct.c