Ich habe einen untraditionellen Weg untersucht, den "Polymorphismus" der Struktur in C vor C11 zu erreichen. Nehmen wir an, wir haben 2 Strukturen:
%Vor%Bei den meisten Compilern könnten wir problemlos zwischen den Zeigern zu den beiden umwandeln und dann auf die gemeinsamen ersten Member zugreifen, wenn kein Padding stattfindet. Dies ist jedoch kein standardisiertes Verhalten.
Nun habe ich die folgende Zeile im C-Standard bis C89 gefunden:
Eine spezielle Garantie wird gemacht, um die Verwendung von Vereinigungen zu vereinfachen: Wenn eine Vereinigung mehrere Strukturen enthält, die eine gemeinsame Anfangssequenz teilen, und wenn das Vereinigungsobjekt gegenwärtig eine dieser Strukturen enthält, ist es erlaubt, die gemeinsame Initiale zu überprüfen Teil von jedem von ihnen. Zwei Strukturen teilen eine gemeinsame Anfangssequenz, wenn entsprechende Mitglieder kompatible Typen für eine Folge von einem oder mehreren Anfangselementen haben.
Es gibt auch Folgendes an:
Ein Pointer auf ein Union-Objekt, der in geeigneter Weise umgewandelt wird, zeigt auf jedes seiner Member (oder wenn ein Member ein Bit-Feld ist, dann auf die Einheit, in der es sich befindet) und umgekehrt.
Wenn ich nun eine Vereinigung dieser beiden Strukturen erstelle:
%Vor%Und benutze es so:
%Vor%Welches kompiliert und läuft gut und gibt auf gcc (GCC) 4.8.3 20140911 die Ausgabe
%Vor%Wird das Verhalten gemäß den Zitaten aus dem oben angegebenen Standard wohldefiniert sein?
Nach ein paar Recherchen denke ich, dass ich eine qualifizierte Antwort für diese Frage habe.
Das Zitat stammt aus dem C89-Standard. C99 und C11 haben es so umformuliert:
Eine spezielle Garantie wird gemacht, um die Verwendung von Vereinigungen zu vereinfachen: Wenn eine Vereinigung mehrere Strukturen enthält, die eine gemeinsame Anfangssequenz teilen (siehe unten), und wenn das Vereinigungsobjekt gegenwärtig eine dieser Strukturen enthält, ist es erlaubt Überprüfen Sie den gemeinsamen Anfangsteil von jedem von ihnen überall, dass eine Erklärung des fertigen Typs der Vereinigung sichtbar ist.
Der letzte Teil kann auf verschiedene Arten interpretiert werden. Das Komitee hat es jedoch so gelassen wie es ist. Ihnen zufolge bedeutet dies, dass die Überprüfung des "gemeinsamen Anfangsteils" der Strukturen nur mit einem Objekt des Typs union
durchgeführt werden kann, für das die Deklaration deklariert wurde. Das wird sehr gut in
Mints97
16.01.2015, 14:01