2016-10-26 2 views
5

Angenommen, ich habe eine Union u mit zwei Mitgliedern a und b des gleichen Typs (z. B. Int).Union-Mitglieder des gleichen Typs

union u{ 
    int a,b; 
    char c; 
}; 

Wenn ich a schreiben, übergeben Sie es von Wert auf eine Funktion und die Funktion liest aus b, erwartet den a Wert zu erhalten, wird es Probleme, wenn man bedenkt a und b die gleiche Art haben? Müssen die Member-Lesevorgänge die Schreibvorgänge der Member genau spiegeln?

+3

C11 Entwurf N1548 könnte sagen, dass es keine Probleme geben wird. Ich kann es nicht sicher sagen. Liest noch. Eine Fußnote: "95) Wenn das Mitglied, das den Inhalt eines Union-Objekts gelesen hat, nicht mit dem zuletzt verwendeten Element einen Wert im Objekt speichert, wird der entsprechende Teil der Objektdarstellung des Werts als neu interpretiert eine Objektdarstellung in dem neuen Typ, wie in 6.2.6 beschrieben (ein Prozess, der manchmal '' punning '' genannt wird). Dies könnte eine Trap-Repräsentation sein. " – Ryan

Antwort

4

Ja, das ist in Ordnung.

Der Standard (C11 Entwurf) sagt:

[...], wenn ein Zusammenschluss mehrere Strukturen enthält, die eine gemeinsame Anfangs Sequenz teilen (siehe unten), und wenn die Vereinigung Objekt enthält zur Zeit zu diese Strukturen ist es erlaubt, den gemeinsamen Anfangsteil jeder von ihnen überall, dass eine Erklärung des fertiggestellten Art der Vereinigung sichtbar

ist
kann

Hier sind die beiden ganzen Zahlen betrachtet werden, um zu untersuchen, um zu sein (sehr sim ple) Strukturen, die die gleiche Anfangssequenz teilen.

Auch das ignorieren, gibt es auch:

Wenn das Mitglied den Inhalt einer Vereinigung Objekt ist das gleiche als das Element verwendet, um letzte zu speichern einen Wert im Objekt nicht lesen verwendet, die entsprechende Teil der Objektdarstellung des Wertes wird als Objektdarstellung in den neuen Typ

Reinterpreting ein int als int ist ziemlich sicher neu interpretiert. :)

Verwandte Themen