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个元素。我在这里给出的与指定初始值设定项语法相同,不是吗?