Anonyme Unterstrukturen innerhalb einer Union (Struktur)
-
Guten Tag!
Ich habe mal eine kleine Frage, und hoffe hier Antwort zu finden:
Ich habe zwei Varianten einer Typdefinition einer Union (Der Typ dient dazu komfortabel byte-/bitweise auf eine 16Bit-Variable zugreifen zu können):
Variante 1
typedef union _tV16 { tUINT16 ui16; tINT16 i16; tUINT8 ui8[2]; struct { tUINT8 LB; tUINT8 HB; } byte; //<-Unterschied struct { unsigned char b0:1; unsigned char b1:1; //[...] unsigned char b15:1; } bits; //<-Unterschied } tV16;Variante 2
typedef union _tV16 { tUINT16 ui16; tINT16 i16; tUINT8 ui8[2]; struct { tUINT8 LB; tUINT8 HB; } ; //<-Unterschied struct { unsigned char b0:1; unsigned char b1:1; //[...] unsigned char b15:1; } ; //<-Unterschied } tV16;Der springende Punkt sind die Unterstrukturen. Einmal anonym, einmal mit Namen "byte" und "bits".
Bei Variante 1 kann ich logischerweise so zugreifen:tV16 v16_test; v16_test.byte.LB = 4; v16_test.bits.b0 = 1;Bei Variante 2 kann ich aber schreiben:
tV16 v16_test; v16_test.LB = 4; v16_test.b0 = 1;Variante 2 ist damit natürlich komfortabler (wenn auch vielleicht nicht gaanz so sauber).
Jetzt aber die Frage, auf die ich bisher keine Antwort gefunden habe: Ist Variante 2 Standard C??
Habs mit mehreren Compilern getestet, und immer Erfolg gehabt. Aber zuverlässige Info hab ich bisher keine gefunden.Über Antworten würde ich mich sehr freuen!
Gruß!
-
Ist leider (noch nicht) standardkonform. Aber ich glaube gelesen zu haben, dass man das für C1x (also dem nächsten C-Standard) erlauben will.
Nachtrag: In http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1494.pdf unter 6.7.2.1 kann man die Unterschiede zum bisherigen Standard deutlich sehen.
-
DeviceExplode() schrieb:
Jetzt aber die Frage, auf die ich bisher keine Antwort gefunden habe: Ist Variante 2 Standard C??
Habs mit mehreren Compilern getestet, und immer Erfolg gehabt. Aber zuverlässige Info hab ich bisher keine gefunden.Seltsam. Wenn main.c so aussieht:
#include <stdint.h> typedef uint16_t tUINT16; typedef int16_t tINT16; typedef uint8_t tUINT8; typedef int8_t tINT8; typedef union _tV16 { tUINT16 ui16; tINT16 i16; tUINT8 ui8[2]; struct { tUINT8 LB; tUINT8 HB; } ; //<-Unterschied struct { unsigned char b0:1; unsigned char b1:1; //[...] unsigned char b15:1; } ; //<-Unterschied } tV16; int main(void) { tV16 x; x.LB = 42; }sagt der gcc:
$ gcc -std=c99 main.c main.c:18: Warnung: Deklaration deklariert nichts main.c:26: Warnung: Deklaration deklariert nichts main.c: In Funktion »main«: main.c:32: Fehler: »tV16« hat kein Element namens »LB«
-
@µngbd: Aja, mit gcc hat ichs noch nicht getestet. Interessant! Ich hatte es bisher mit nem Compiler für Microcontroller und nem ollen VisualStudio 6 probiert. Ein Arm Gnu Compiler wär als nächstes dran gewesen.

@Tim: Aufschlussreicher Link, Dankeschön!
Gruß
-
Interessant: Mit einem GNU Compiler für ARM aus dem Jahr 2004 gehts auch.
Fazit: Mit Hilfe der Antwort von Tim und noch etwas weiterer Recherche hab ich jetzt rausgefunden, dass es in C1x enthalten sein wird, in C99 aber nicht drin ist.
Danke für alle Antworten!
Gruß!
-
Bei der gcc ist das iirc auch schon eine Weile als Extension drin. Mit dem Switch von mngbd "-std=c99" werden solche Dinger aber (zum Teil) ausgeschalten. Ohne switch sollte es gehen, bzw. auch mit "-std=gnu99".