在声明时初始化一个union数组

alb*_*umi 6 c arrays sse initializer unions

我正在尝试在声明时初始化以下union数组:

typedef union { __m128d m;  float f[4]; } mat;
mat m[2] = { {{30467.14153,5910.1427,15846.23837,7271.22705},
{30467.14153,5910.1427,15846.23837,7271.22705}}};
Run Code Online (Sandbox Code Playgroud)

但是我发现了以下错误:

matrix.c: In function ‘main’:
matrix.c:21: error: incompatible types in initialization
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[0]’)
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[0]’)
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[0]’)
matrix.c:21: error: incompatible types in initialization
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[1]’)
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[1]’)
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[1]’)
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 12

引用此页面:

使用C89样式的初始化程序,必须按声明的顺序初始化结构成员,并且只能初始化union的第一个成员.

所以,要么先放入float数组,要么尽可能使用C99并写:

mat m[2] = { { .f = { /* and so on */ } }, /* ... */ };
Run Code Online (Sandbox Code Playgroud)

重要的是.f.