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

时间:2014-04-03 18:15:28

标签: c c99

当我写一个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;
}

1 个答案:

答案 0 :(得分:1)

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