2016-07-18 3 views
6

Ich habe diese Vereinigung:Ist es zulässig, mehrere überlappende Felder in einer Mitgliedsinitialisierungsliste einer Union zu initialisieren?

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) 
    { 
    } 
}; 

Wir haben ein Tool, das C++ Code für mögliche Fehler analysiert, und es hat eine falsch-positive, wo es denkt, dass u32 wurde nicht initialisiert, wenn ich dies schreibe.

fand ich, dass VC++ mir dieses Mitglied Initialisiererliste schreiben lassen:

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

Es ist das Werkzeug zum Schweigen bringen, aber es sieht ... mächtig zweifelhaft. (Edit basierend auf den Kommentaren: GCC und Clang wird es nicht akzeptieren, so mächtig zweifelhaft scheint gerechtfertigt.)

Für Strukturen werden Elementinitialisierungen in ihrer Reihenfolge der Definition in der Struktur ausgeführt. Gibt es etwas Ähnliches für Gewerkschaften, das sicherstellt, dass dies nicht aufgrund von u32(0) auf null gestellt wird?

Wir haben keine großen Vorwände für Portabilität. Momentan zielt dieses Projekt auf Windows ab, könnte aber in Zukunft auf iOS und Android ausgerichtet sein. Ich kann so ziemlich garantieren, dass es nicht auf seltsamen und exotischen Plattformen auftaucht.

Natürlich kann ich nur a, b, c und d im Körper des Konstruktor, der das ganze Problem ausweicht (oder ich kann die Warnung deaktivieren), aber es hat mich neugierig.

+0

Keine Antwort per se aber, gibt es keine Direktive (Pragma oder etwas), damit dieses Tool weiß, dass es in diesem speziellen Fall OK ist? – Amit

+0

[gcc-5.1 lehnt es ab] (http://ideone.com/15OaqR) – PcAF

+0

@Amit, mir fehlen die Problemumgehungen für dieses spezielle Problem nicht. :) Es gibt einen, ja. – zneak

Antwort

5

N4594

12.6.2/§? (Unter § 9):

[Anmerkung: [...] -Ende note] Ein Versuch, initialisieren mehr als eine nicht-statische Daten Mitglied einer Gewerkschaft das Programm rendert schlecht ausgebildet.

Verwandte Themen