struct in struct

Gast #1567656
Hallo zusammen,
irgendwie habe ich derzeit eine knoten oder es geht nicht was ich haben 
will. Folgendes habe ich derzeit:

struct a {
unsigned char uszDay;
unsigned char uszMonth;
};

struct b {
unsigned char uszMonth;
};

Struct b ist also eine Teilmenge von a. Kann ich in a die structur b 
integrieren ohne sie als structur zu deklarieren?

Ich möchte nicht :

struct a {
unsigned char uszDay;
struct b c;
}

... da ich weiterhin das einzelelement ansrechen möchte:
a->uszDay
a->uszMonth

und nicht a->c.uszMonth

Geht das überhaupt?

Danke schon mal

Gruß

Frank
Soll struct a* später an eine Funktion übergeben werden, die struct b* 
erwartet? Wenn ja, dann könnte man in struct a gleiche Variablen anlegen 
wie in struct b (wie in Deinem ersten Listing), wobei die Variablen von 
b in a an erster Stelle und in der gleichen Reihenfolge sein müssen. 
Laut dem Standard werden alle Membervariablen einer Struktur 
nacheinender im Speicher abgelegt, was in diesem Fall bedeuten würde, 
dass man einen a* auch als b* benutzen könnte.

MfG Mark
Gast
Mark P. schrieb:
> Wenn ja, dann könnte man in struct a gleiche Variablen anlegen
> wie in struct b

Vorsicht. Das geht zwar meistens, es ist aber eben nicht garantiert, 
dass das geht.
Der Compiler dürfte z.B. für die zweite struct ein anderes 
allignment/packing verwenden, ohne dass er damit gegen die C specs 
verstößt.

Wenn man also sowas macht: Ganz großen Kommentar daneben schreiben, 
damit man sich beim nächsten Compilerupdate nicht wundert, warum 
plötzlich alles falsch ist...
>Der Compiler dürfte z.B. für die zweite struct ein anderes
>allignment/packing verwenden, ohne dass er damit gegen die C specs
>verstößt.

Dagegen kann man vorgehen, indem man die Struktur als _packed_ 
deklariert.

Mein irgendwo gelesen zu haben, dass bei gtk++ (reines C) 
Objektorientierung benutzt wird, vllt kann man die Techniken auch hier 
anwenden.

MfG Mark
Gast
>> Wenn ja, dann könnte man in struct a gleiche Variablen anlegen
>> wie in struct b
>
> Vorsicht. Das geht zwar meistens, es ist aber eben nicht garantiert,
> dass das geht.

Doch, ist es. Ich hab jetzt auf die Schnelle keine Passage in der 
ISO-Norm gefunden, wo das direkt so steht, aber es folgt zumindest als 
logische Konsequenz aus Kapitel 6.5.2.3 Punkt 6:

"One special guarantee is made in order to simplify the use of unions: 
if
a union contains several structures that share a common initial sequence
(see below), and if the union object currently contains one of these
structures, it is permitted to inspect the common initial part of any of
them anywhere that a declaration of the complete type of the union is
visible. Two structures share a common initial sequence if corresponding
members have compatible types (and, for bit-fields, the same widths) for 
a
sequence of one or more initial members."

Wenn man auf die "common initial sequence" bei unions so zugreifen kann, 
muß das Speicherlayout der Sequenz bei allen Strukturen gleich sein.
Gast
Stimmt. Dann also mit Segen der ISO und ohne "/* Warning: Evil Hack */" 
davor.

Das hier:
> Struct b ist also eine Teilmenge von a. Kann ich in a die structur b integrieren
geht aber trotzdem nicht ohne die beiden structs identisch zu machen ;)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.