当我写一个question regarding 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;
}
答案 0 :(得分:1)
看起来很明智......如果你的驯服编译器没有抱怨标准符合性方式,我就会使用它。更令人担心的是,您可能正在尝试覆盖value
和bits
,并且将数据填充到联合的一个替代中,将其从另一个中取出是 undefined 。除了Endianness之外,联盟可能会使用完整的单词,并且很可能在一端有value
而在另一端有bits
(取决于可用的指令及其方便或时间)。标准准确地声明了这个未定义,以实现这样的余地。