怎么做这个初始化?

时间:2014-04-22 09:17:04

标签: c struct initialization c-preprocessor

我有一个结构,我需要在编译时初始化。这是当前(伪)代码:

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 标准。

1 个答案:

答案 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}};

或者使用适当的宏替换来提高可读性。