【发布时间】:2014-04-22 09:17:04
【问题描述】:
我有一个结构,我需要在编译时对其进行初始化。这是当前(伪)代码:
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 类型为struct A [3] 的对象的数组。为什么不简单地列出b 的值,就好像它是一个一维数组(与访问b[20] 的方式相同)?
-
第三,现在我需要向
struct B添加一个新字段,不知道如何修改初始化。新的struct B应为:struct B { int c[16]; struct A a[16][3]; }
编译器是 arm-none-eabi-gcc 4.7.2,没有强制执行任何 C 标准的标志。
【问题讨论】:
-
用
gcc -E编译你的代码,在预处理器完成他的工作后得到输出。我想输出会帮助你理解宏的作用。 -
@user2799037,谢谢,这通常是正确的方法。然而,这一次预处理的代码和我预期的一样。我仍然不知道它是如何工作的。
-
内部数组元素的括号不是强制性的。所以你可以将你的
struct B初始化为一维数组。 -
@MadHatter,删除
DEFAULT中error: field name not in record or union initializer中的第一个和最后一个{。 -
另一方面,删除
b =中的一个大括号会导致error: field name not in record or union initializer。用-E预处理的代码有4 个前大括号:{{{{ .a = 1, ...。
标签: c struct initialization c-preprocessor