怪异:union第一个成员是多维数组,就不能用套嵌括号初始化了?

时间:2022-09-05 14:43:00
  多维数组可以这样初始化:int mm[2][2]={0,1,2,3};
  也可以用套嵌括号初始化:int mm[2][2]={{0,1},{2,3}};
  问题是,假若union的第一个成员是多维数组mm[2][2]我就只能用第一种方式初始化!第二种方式会报错。不知说清楚没,请看源码:
union matrix{
int mm[2][2];
int mm00,mm01,mm10,mm11;
};

void main(void){
union matrix m={0,1,2,3};
/**
union matrix m1={
{0,1},
{2,3}
};
*/
}

  上面的代码可以过编译,但把注释打开,会报错:
test.c: In function ‘main’:
test.c:10:3: error: extra brace group at end of initializer
test.c:10:3: error: (near initialization for ‘m1’)
test.c:10:3: warning: excess elements in union initializer [enabled by default]
test.c:10:3: warning: (near initialization for ‘m1’) [enabled by default]

不知道这个问题有人遇到过没,为什么就不能用套嵌括号的形式初始化呢?

3 个解决方案

#1



几个问题
1、LZ的定义,其实是
union matrix {
    int mm[2][2];
    int mm00;
    int mm01;
    int mm10;
    int mm11;
};
而LZ大概是想定义
union matrix {
    int mm[2][2];
    int m[4];
};

2、union的成员,谁在前,就得用该成员对应的初始化方法:
如果是
union matrix {
    int mm[2][2];
    int m[4];
};
那么得是
union matrix m = {{{1,2},{3,4}}};
注意这里括号的数目,最外面的{}是union的,而里面的是mm的initializer

如果是
union matrix {
    int m[4];
    int mm[2][2];
};
那么得是
union matrix m = {{1,2,3,4}};
同样要注意括号的数目,最外面的{}是union的,而里面的是m的initializer

#2


引用 1 楼 ForestDB 的回复:
C/C++ code
?



12345678910111213141516171819202122232425262728293031323334

几个问题 1、LZ的定义,其实是 union matrix {     int mm[2][2];     int mm00;     int mm01;     int mm10;     int mm11; }; 而LZ大概是想……


注意这里括号的数目,最外面的{}是union的,而里面的是mm的initializer 

#3


引用 1 楼 ForestDB 的回复:
C/C++ code?123456789101112131415161718192021222324252627282930313233几个问题1、LZ的定义,其实是union matrix {    int mm[2][2];    int mm00;    int mm01;    int mm10;    int mm11;};而LZ大概是想定义union matr……

回答的太满意了!
老实说,写代码时候,就发现float mm00,mm01,mm10,mm11有些诡异,编译器才不会因为你把他们写在一行就连续分配内存。应该用struct括起来,struct {float mm00,mm01,mm10,mm11};

#1



几个问题
1、LZ的定义,其实是
union matrix {
    int mm[2][2];
    int mm00;
    int mm01;
    int mm10;
    int mm11;
};
而LZ大概是想定义
union matrix {
    int mm[2][2];
    int m[4];
};

2、union的成员,谁在前,就得用该成员对应的初始化方法:
如果是
union matrix {
    int mm[2][2];
    int m[4];
};
那么得是
union matrix m = {{{1,2},{3,4}}};
注意这里括号的数目,最外面的{}是union的,而里面的是mm的initializer

如果是
union matrix {
    int m[4];
    int mm[2][2];
};
那么得是
union matrix m = {{1,2,3,4}};
同样要注意括号的数目,最外面的{}是union的,而里面的是m的initializer

#2


引用 1 楼 ForestDB 的回复:
C/C++ code
?



12345678910111213141516171819202122232425262728293031323334

几个问题 1、LZ的定义,其实是 union matrix {     int mm[2][2];     int mm00;     int mm01;     int mm10;     int mm11; }; 而LZ大概是想……


注意这里括号的数目,最外面的{}是union的,而里面的是mm的initializer 

#3


引用 1 楼 ForestDB 的回复:
C/C++ code?123456789101112131415161718192021222324252627282930313233几个问题1、LZ的定义,其实是union matrix {    int mm[2][2];    int mm00;    int mm01;    int mm10;    int mm11;};而LZ大概是想定义union matr……

回答的太满意了!
老实说,写代码时候,就发现float mm00,mm01,mm10,mm11有些诡异,编译器才不会因为你把他们写在一行就连续分配内存。应该用struct括起来,struct {float mm00,mm01,mm10,mm11};