也可以用套嵌括号初始化: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
注意这里括号的数目,最外面的{}是union的,而里面的是mm的initializer
#3
回答的太满意了!
老实说,写代码时候,就发现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
注意这里括号的数目,最外面的{}是union的,而里面的是mm的initializer
#3
回答的太满意了!
老实说,写代码时候,就发现float mm00,mm01,mm10,mm11有些诡异,编译器才不会因为你把他们写在一行就连续分配内存。应该用struct括起来,struct {float mm00,mm01,mm10,mm11};