使用C99样式的指定初始化程序列表以下列方式初始化联合中位域的成员是否有效?

当我写一个关于PC-Lint的问题时 ,我假设以下初始化在C99中有效。 @JoachimPileborg提到它可能不是,我无法找到任何提供这样或那样的好例子的信息。 我知道它的编译和行为与我期望的一样,我只想知道它是正确的C99代码。

这是在C99中初始化以下联合的有效方法吗?

typedef union { struct { unsigned int a : 4; unsigned int b : 4; unsigned int c : 4; unsigned int d : 4; } bits; unsigned short value; } My_Value; int main (void) { My_value test[] = { { .bits.a = 2, .bits.b = 3, .bits.c = 2, .bits.d = 3, }, { .bits.a = 1, .bits.b = 1, .bits.c = 1, .bits.d = 0, }, }; /* Do something meaningful. */ return 0; } 

看起来很健康……如果你的驯服编译器没有抱怨标准的合规性,我就会使用它。 更令人担心的是,你可能正试图覆盖valuebits ,并将数据填充到一个联合的替代品中,将其从另一个中取出是未定义的 。 除了字节顺序之外,联合可能会使用完整的单词,并且很可能在一端具有value在另一端具有bits (取决于可用指令及其便利性或时序)。 标准准确地声明了这个未定义,以实现这样的余地。