c - 使用 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(取决于可用的说明及其便利性或时间)。标准宣布这一点未定义,正是为了给实现提供这样的回旋余地。

最新更新