我有一个结构,我需要在编译时初始化。这是当前(伪)代码:
struct A
{
int a;
int b;
};
struct B
{
struct A а[16][3];
};
#define DEFAULT {{ \
.a = 1, \
.b = 2, \
}, \
{ \
.a = 3, \
.b = 8, \
}, \
{ \
.a = 11, \
.b = 29, \
}}
#define DEFAULT2 DEFAULT, DEFAULT
#define DEFAULT4 DEFAULT2, DEFAULT2
#define DEFAULT8 DEFAULT4, DEFAULT4
#define DEFAULT16 DEFAULT8, DEFAULT8
struct B b = {{DEFAULT16}};
我不明白这段代码:
此外,为什么我们在DEFAULT的定义中需要双括号。我明白了
{
.a = 3,
.b = 8,
}
是普通的结构初始化。但是第二对括号看起来好像我正在将b
初始化为类型16
的{{1}}对象数组。为什么不简单地列出struct A [3]
的值,就好像它是一维数组(与访问b
的方式相同)?
第三,现在我需要向b[20]
添加一个新字段,并且不知道如何修改初始化。新struct B
应为:
struct B
编译器是arm-none-eabi-gcc 4.7.2,没有标记来强制执行任何 C 标准。
答案 0 :(得分:0)
如果我理解正确,
struct A
内的事物需要一个支撑,例如
struct A a = { .a = 1, .b = 2 };
二维数组需要两个括号,例如
int array[2][2] = {
{ 1, 1 },
{ 1, 1 }
};
struct B
内的事物需要最后的括号。
最后,要将int c[16]
添加到struct B
,您可以使用以下内容替换代码段的最后一行:
struct B b = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{DEFAULT16}};
或者使用适当的宏替换来提高可读性。