当我写一个关于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;
}
看起来很理智...如果你的驯服编译器不抱怨标准合规性的提高,我会使用它。更令人担忧的是,您可能正在尝试覆盖value
和bits
,并且将数据填充到联合的一个替代方案中,并将其从另一个替代方案中取出是未定义的。撇开字节序不谈,联合可能会用完一个完整的单词,并且很可能在一端有value
,在另一端有bits
(取决于可用的说明及其便利性或时间)。标准宣布这一点未定义,正是为了给实现提供这样的回旋余地。