【问题标题】:Warning when trying to initialize a 2D struct array with two initializer lists尝试使用两个初始化程序列表初始化 2D 结构数组时发出警告
【发布时间】:2015-08-25 07:43:22
【问题描述】:

我正在尝试使用以下行将用户定义类型的二维数组初始化为零,

qmf_t X_hybrid_left[32][32] = {{0}};

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

警告:初始化器周围缺少大括号 [-Wmissing-braces]"

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

每边使用三个大括号是否正确?什么意思?

【问题讨论】:

  • 在这种情况下,我只是取消警告并将代码编写为{0},这很好。

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


【解决方案1】:
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 初始化语法

初始化器:
赋值表达式
{ 初始化列表 }
{ 初始化列表,}

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

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

来自同一部分:

[16] 否则,具有聚合或 union 类型应该是 initializers大括号括起来的列表 元素或命名成员。

[20] 如果聚合或联合包含的元素或成员是 聚合或联合,这些规则递归地应用于 子聚合或包含的联合。如果一个初始化器 子聚合或包含联合以左大括号开头, 由该大括号及其匹配的右大括号括起来的初始化程序 初始化子聚合的元素或成员或 包含联合。否则,列表中只有足够的初始化器是 考虑到子聚合的元素或成员或 包含联盟的第一个成员;任何剩余的初始化器 剩下来初始化聚合的下一个元素或成员 当前子聚合或包含的联合是其中的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2021-05-18
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2015-07-29
    相关资源
    最近更新 更多