当我写一个关于 PC-Lint 的问题 https://stackoverflow.com/questions/22823277/how-do-i-suppress-pc-lint-errors-for-c99-style-initialization-of-structure-membe,我假设以下初始化在 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;
}
看起来很正常...如果你的编译器不抱怨标准合规性way顶起来,我就用它更令人担忧的是,您可能正在尝试覆盖value
and bits
,将数据填充到联合的一个替代方案中,然后将其从另一个替代方案中取出是不明确的。撇开字节序不谈,联合可能会用完一个完整的单词,并且很可能有value
一端和bits
另一个(取决于可用的指示及其便利性或时间安排)。标准明确声明了这一点未定义,以便为实现提供这样的余地。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)