2016-07-18 126 views
6

ho questa unione:È legale inizializzare più campi sovrapposti nell'elenco di inizializzazione di un membro del sindacato?

union Foo 
{ 
    uint32_t u32; 
    struct 
    { 
     uint32_t a : 10; 
     uint32_t b : 10; 
     uint32_t c : 10; 
     uint32_t d : 2; 
    }; 

    Foo() : a(0), b(1), c(2), d(3) 
    { 
    } 
}; 

Abbiamo uno strumento che analizza il codice C++ per i potenziali bug, e ha un falso positivo in cui si pensa che u32 non è stato inizializzato quando scrivo questo.

ho scoperto che VC++ mi permette di scrivere questa lista di inizializzazione membro:

Foo() : u32(0), a(0), b(1), c(2), d(3) 

Esso chiuso lo strumento, ma sembra ... potentemente dubbia. (Modifica basata sui commenti: GCC e Clang non lo accetteranno, quindi il dubbio potrebbe sembrare giustificato.)

Per le strutture, gli inizializzatori dei membri vengono eseguiti nel loro ordine di definizione nella struttura. C'è qualcosa di simile per i sindacati che garantisce che questo non venga azzerato a causa di u32(0)?

Non abbiamo grandi pretese di portabilità. In questo momento, questo progetto è indirizzato a Windows, ma potrebbe essere indirizzato a iOS e Android in futuro. Posso praticamente garantire che non si presenterà su piattaforme strane ed esotiche.

Naturalmente, posso solo impostare a, b, c e d nel corpo del costruttore, che elude l'intera questione (o posso disattivare l'avviso), ma mi ha fatto curioso.

+0

Non è una risposta di per sé ma, non esiste alcuna direttiva (pragma o qualcosa) per consentire a tale strumento di sapere che è OK in questo caso specifico? – Amit

+0

[gcc-5.1 lo rifiuta] (http://ideone.com/15OaqR) – PcAF

+0

@Amit, non sto andando a corto di soluzioni alternative per questo problema specifico. :) Ce n'è uno, sì. – zneak

risposta

5

N4594

12.6.2/§? (Under § 9):

[Nota: [...] -end nota] Un tentativo di inizializzare più di un membro di dati non-statico di un'unione rende il programma mal formati. [Nota: [...] -end note]

Problemi correlati