[C]Zugriff auf inexistente UNION-Variable

Herakles

Profifragensteller
Moin!

Ich programmiere gerade in AVRStudio5, einer Umgebung für die Entwicklung auf Mikroprozessoren von ATMEL.

In einem der Beispielprojekte habe ich etwas für mich völlig Neues gefunden. Dort wird folgender Code verwendet (und er kompiliert auch sauber durch):

Code:
struct  tftphdr {
  uint16_t th_opcode;    /* packet type */
  union {
    uint16_t tu_block; /* block # */
    int16_t tu_code;  /* error code */
    uint8_t tu_stuff[1];  /* request packet stuff */
   }
 __attribute__ ((packed))
   th_u;
  uint8_t th_data[1];   /* data or error string */
}

(...)

uint8_t data[SEGSIZE+sizeof(struct tftphdr)];
struct tftphdr *answer = (struct tftphdr *)data;

(...)

answer->th_block = htons(block++);

In dem Struct finde ich kein "th_block", lediglich ein "tu_block" innerhalb des enthaltenen UNIONs.

Wie kann das funktionieren? Meinem Verständnis zufolge kann doch nur auf Elemente eines struct zugegriffen werden, die auch namentlich korrekt sind...!?

Kann mir da jemand aushelfen?

Beste Grüße
Herakles
 
Der Code wird wohl nur mit GNU C89/GNU C99 laufen und transparent Unions nutzten. Mit $(CC) -std=c99 wird der Code kaputt gehen. Tu dir den gefallen und meide GNU Erweiterungen für solch einfache Dinge. Es ist zwar unschön mehr zu Tippen, aber portabel. Ist dir die Tipparbeit zu viel nutze #define um dir kürzere, sinnvolle Namen zu definieren.
 
Das hat nichts mit transparent unions zu tun. Ich tippe darauf, dass irgendwo ein #define th_block tu_block rumgeistert. Einfach mal die Ausgabe des Präprozessors begutachten.
 
@Tron: 1:0 für Dich. Es war ein define.

Wer macht so einen scheiß? Bekloppt...

Danke an Euch beide für die Hilfe!

Herakles
 
Zurück
Oben