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
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
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
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
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
>> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.