我试图通过使用以下行
将用户定义类型的2D数组初始化为零qmf_t X_hybrid_left[32][32] = {{0}};
其中qmf_t
是用户定义的类型。在这里,我得到了编译器警告,
警告:初始化程序[-Wmissing-braces]周围缺少大括号“
但如果我使用qmf_t X_hybrid_left[32][32] = {{{0}}};
,即每边3个括号,警告就会消失。
每侧使用三个支架是否正确?这是什么意思?
答案 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以左括号开头 由该支撑包围的初始化器及其匹配的右支撑 初始化子聚合的元素或成员或 包含工会。否则,列表中只有足够的初始值设定项 考虑到子聚合的元素或成员或 所包含的联盟的第一个成员;任何剩余的初始化者 留下来初始化下一个元素或聚合的成员 当前的分包或包含联盟是其中的一部分。