2014-04-03 37 views
2

當我寫了一個question regarding PC-Lint時,我假定以下初始化在C99中有效。 @JoachimPileborg提到它可能不是,我也無法找到任何能夠以這種或那種方式提供良好範例的信息。我知道它的編譯和行爲與我預期的一樣,我只想確切地知道它是適當的C99代碼。使用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

看起來很理智......如果你的馴服編譯器不會抱怨標準符合,那麼我會使用它。 – vonbrand

回答

1

看起來神志清醒......如果你馴服的編譯器不抱怨與標準的符合性手搖方式了,我會使用它。更令人擔憂的是,你可能正試圖覆蓋valuebits,並且將數據填充到工會的一個替代方案中,將其從另一個替代爲undefined。拋開排除,工會可能會用完一個單詞,並且很可能在一端有value,而在另一端可能有bits(取決於可用的指令及其便利或時間)。這些標準聲明瞭這個未定義的準確地給予實現這樣的餘地。

+1

它不再是未定義的。它在C89中沒有定義,但是C99聲明價值現在「未指定」。參見缺陷報告#257。 –

+0

@DietrichEpp,好的。它不會再啓動nethack,但你仍然不能依靠它「做我今天認爲的理智」...... – vonbrand

+0

@vonbrand,謝謝你的信息! –

相關問題