2011-01-12 1 views
2

SDL_Event ist eine Union eines vorzeichenlosen 8-Bit-Typs und vieler Strukturen, deren erstes Element ein vorzeichenloser 8-Bit-Typ ist. Die empfohlene Verwendung besteht darin, auf das Uint8-Element der Union zuzugreifen, um zu bestimmen, um welchen Ereignistyp es sich handelt, und dann auf die Union durch das für diesen Typ geeignete Element zuzugreifen.Ist eine Union von Strukturen ein nicht definiertes Verhalten des ersten Elements?

Dies hängt natürlich von allen Typen in der Union ab, die denselben Platz für die Typkennung reserviert haben. Können wir sicher sein, dass dies der Fall ist, oder ist dieses undefinierte Verhalten?

Edit: machte den Titel beschreibender.

+0

Worüber handelt es sich bei der "Typkennung"? Das 'uint8_t' oder etwas anderes? C-Gewerkschaften speichern ihren Typ nicht von Natur aus. –

+0

@R .. Ja, die Uint8, die ich glaube, ist zu Uint8_t typedef'd. –

Antwort

5

Das erste Element einer Struktur ist garantiert vom Anfang der Struktur an "offset 0". Also sollte es sicher sein.

4

Ich fand es in der C99-Norm.

6.5.2.3.5:

Eine besondere Garantie wird gemacht, um die Verwendung von Gewerkschaften zu vereinfachen: Wenn eine Vereinigung mehr Strukturen enthält, die eine gemeinsame Anfangssequenz teilen (siehe unten), und die Vereinigung, wenn Objekt enthält derzeit eine dieser Strukturen, es ist erlaubt, die gemeinsame ersten Teil von ihnen irgendwo zu überprüfen, ob eine Erklärung des vollständigen Typs der Union sichtbar ist. Zwei Strukturen teilen sich eine gemeinsame Anfangssequenz, wenn entsprechende Mitglieder kompatible Typen (und für Bitfelder die gleichen Breiten) für eine Sequenz von einem oder mehreren Anfangselementen haben.

Es sieht also so aus, als wäre die SDL-Implementierung nahe an etwas, das garantiert korrekt ist. Wenn es eine Struktur verwenden würde, die nur einen Uint8 enthält, dann wäre es garantiert, aber ich denke, dass der nackte Uint8 ein undefiniertes Verhalten ist, das höchstwahrscheinlich wie erwartet funktioniert.

+0

Sie haben Recht. Ich könnte es in einer anderen Version des Standards gesehen haben oder einfach nur vorgestellt :) – Jester

Verwandte Themen