2011-11-16 22 views
3

我有一个像这样定义的简单结构:静态初始化结构自我参照

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]} 
}; 

当“指数”指的是定义为“小数”左边索引值?

回答

5

*

如果你绝望,你总是可以设计用于此目的的宏:

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


*或 “是”,因为@Jens指出在他的答案中,C99。

+0

接近,但answwer是肯定的,看到我的答案:) –

+0

@Jens:我没有想到的是(使+1为你有趣的答案)。从技术上讲,它仍然是“不”,因为它不是OP的语法...... –

+0

好点。我走了那条路。谢谢! – DevNull

-1

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

enter image description here

或者 - 用舌头脸颊删除 - 我不知道有在功能支持此功能的内置,但你总是可以使用外部工具来编写初始化代码为你。


基本上你写一些方便的语言脚本中定义的结构,并宣布与长手intialization的变量,输出交流的代码片段,然后用C-预处理器的#include功能来生成文件到您的阻力码。

你会想让构建管理器意识到这个需求。在使它看起来像

cfile.o: cfile.c mystruct.c 

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

有一个snark的地方,这不是它。 snark高度分散您答案的有用内容(“不,使用代码生成”)。 –

+0

呃... @亚当,这是一个真正的建议。当然,不是任何人的首选,而是完全有效的解决方案。也许我的幽默今天没有校准。 – dmckee

+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意味着这是由逗号分隔。)

+0

Oooo ...我没听说过。俏皮。 – dmckee

+0

+1,但无论如何,在vim中保存一个宏,将其应用n次并以可读的结果结束会有什么优势? – ninjalj

+0

@ninjalj,将'2'换成'42'的那一天? –

0

我认为你需要给一个名称为您新的数组

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