C 静态初始化的结构自引用

C 静态初始化的结构自引用,c,struct,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]} }; 我必须静态初始化这个结构数组 我是否可以在引用以前定义的成员时静态

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

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]}
};
其中“索引”是指定义在“小数”左边的索引值*

如果您感到绝望,您可以随时为此设计一个宏:

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

*或者像@Jens在他的回答中指出的那样,对于C99来说是的。

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

或者——把舌头从脸颊上移开——我不知道是否有一个内置的特性支持这一点,但您始终可以使用外部工具为您编写初始化代码


基本上,您可以用某种方便的语言编写一个脚本,输出一个c代码片段,定义结构并用长时间初始化声明变量,然后使用c预处理器的
#include
功能将生成的文件拖到代码中

您需要让构建经理意识到这一需要。在制造过程中,它看起来像

cfile.o: cfile.c mystruct.c

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

如果你有一个现代的C编译器(又名C99),你可以使用它来展开代码。差不多

#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
表示这是用逗号分隔的。)

我认为需要为新数组指定一个名称

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

有一个地方可以偷懒,但这不是。这个恶作剧很容易分散你答案中有用内容的注意力(“不,使用代码生成”)。呃…@Adam,这是一个真正的建议。当然,这不是任何人的首选,而是一个完全有效的解决方案。也许今天我的幽默已经过时了。我同意这是解决问题的一个非常有效的方法;我不同意你的表达方式。呃,什么?那是从哪里来的?无论如何,我已经删除了我的反对票。接近,但回答是肯定的,请看我的答案:)@Jens:我没有想到这一点(你有趣的答案是+1)。从技术上讲,它仍然是“不”,虽然,因为它不是OP想要的语法…哦…我没听说过。漂亮。+1,但无论如何,与在vim中保存一个宏,应用它n次并最终得到可读的结果相比,这有什么好处?@ninjalj,在你将
2
更改为
42
的那天?@JensGustedt:我以为问题是生成从某个初始索引到某个终止索引的数组,而且不必写两次每个索引?我的意思是,P99_是一部分。@ninjalj,我的理解是OP想要通过一系列类似
{I,&decimals[I]}
的东西来初始化,这样索引字段被初始化为当前数字,指针值被作为
decimals
数组的第I个元素。我在这里给出的与指定初始值设定项语法相同,不是吗?