Forum: Compiler & IDEs struct in struct


von Frank (Gast)


Lesenswert?

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

von Mark .. (mork)


Lesenswert?

Was Du da machen willst nennt sich Vererbung und wird von C nicht direkt 
unterstützt. Falls ein C++-Compiler vorhanden sein sollte:
1
 
2
struct a: public b {
3
    unsigned char uszDay;
4
};

MfG Mark

von Frank (Gast)


Lesenswert?

Hallo Mark,

klar. Das ist auch der Grund warum ich die ganze Zeit dachte es geht. 
Ist jedoch leider in C geschrieben.

Danke.

Gruß

Frank

von Mark .. (mork)


Lesenswert?

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

von Ungast (Gast)


Lesenswert?

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...

von Mark .. (mork)


Lesenswert?

>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

von Rolf Magnus (Gast)


Lesenswert?

>> 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.

von Ungast (Gast)


Lesenswert?

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 ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.