尝试使用两个初始化列表初始化2D结构数组时发出警告

时间:2015-06-10 07:30:09

标签: c arrays multidimensional-array initialization compiler-warnings

我试图通过使用以下行

将用户定义类型的2D数组初始化为零
qmf_t X_hybrid_left[32][32] = {{0}};

其中qmf_t是用户定义的类型。在这里,我得到了编译器警告,

  

警告:初始化程序[-Wmissing-braces]周围缺少大括号“

但如果我使用qmf_t X_hybrid_left[32][32] = {{{0}}};,即每边3个括号,警告就会消失。

每侧使用三个支架是否正确?这是什么意思?

1 个答案:

答案 0 :(得分:12)

qmf_t X_hybrid_left[32][32] = {  /* Row initializers next */
                                { /* Col initializers next */
                                  { /* Struct initializers next */
                                     0
                                  }
                                }
                              };
qmf_t a = {0};
qmf_t b[5] = {{0}};
qmf_t c[10][5] = {{{0}}};

根据C11规范, 6.7.9初始化语法

  

初始化:
      赋值表达式
      {initializer-list}
      {initializer-list,}

虽然在您的特定情况下(将2个数组的所有对象清零),qmf_t X_hybrid_left[32][32] = {0};将与qmf_t X_hybrid_left[32][32] = {{{0}}};相同,但编译器可能会警告您。

但是如果你想要任何非零初始化,你需要使用多个大括号。

来自同一部分:

  

[16]否则,具有聚合或的对象的初始值设定项   union类型应为大括号大括号括号   元素或命名成员。

     

[20]如果聚合或联合包含元素或成员   聚合或联合,这些规则将递归应用于   分包或包含工会。如果是初始化者   subaggregate或contains union以左括号开头   由该支撑包围的初始化器及其匹配的右支撑   初始化子聚合的元素或成员或   包含工会。否则,列表中只有足够的初始值设定项   考虑到子聚合的元素或成员或   所包含的联盟的第一个成员;任何剩余的初始化者   留下来初始化下一个元素或聚合的成员   当前的分包或包含联盟是其中的一部分。