我有一个简单的结构,如下定义:
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的值?
答案 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)
天空中有什么? 这是一只鸟! 不,这是一架飞机! 不,这是代码生成人!
或者 - 从脸颊上移除舌头 - 我不知道有一个内置功能支持这个,但你总是可以使用外部工具为你编写初始化代码。
基本上你用一种方便的语言编写一个脚本,输出定义结构的ac代码片段并用长手初始化声明变量,然后使用c-preprocessor的#include
功能将生成的文件拖到你的身上代码。
您需要让构建管理员了解此需求。在make中它看起来像
cfile.o: cfile.c mystruct.c
my_struct.c:
awk -f generate_my_struct.awk > my_struct.c