Nehmen wir an, Sie schreiben eine Cstruct
, die einen Kurs in einer Mahlzeit darstellt. Eines der Felder im Verlauf struct
ist vom Typ:Schreiben einer sicheren markierten Union in C
enum TP_course {STARTER, MAINCOURSE, DESSERT};
Dann je nach Art des Kurses Sie einen Subtyp haben:
enum TP_starter {SALAD, GRILLEDVEGETABLES, PASTA};
enum TP_maincourse {BEEF, LAMB, FISH};
enum TP_dessert {APPLEPIE, ICECREAM, MOUSSE};
Da nur ein einziger solcher Aufzählungen sein zu einer Zeit verwendet wird (je nach Art des Kurses), macht es Sinn, sie in einem aggregieren union
:
union U_subtype {
enum TP_starter s;
enum TP_maincourse m;
enum TP_dessert d;
};
So ist der Kurs struct
würde li aussehen diese ke:
struct S_course {
enum TP_course type;
union U_subtype stype;
float price_in_USD;
int availability;
...and all the rest of data would follow...
};
Ok, alles klar, aber ... gibt es eine Codierung Strategie, die ich folgen könnte, um zu versuchen sicheren Zugang zur stype
getaggt Vereinigung oben zu erzwingen? Vielleicht undurchsichtig machen?
Zum Beispiel, wenn ich einen switch/case
Block für einen enum
schreiben, und ich vergessen, einen case
für einen Wert zu schreiben, wird der Compiler eine Warnung auslösen, die für die Aufrechterhaltung des Codes in der Zukunft eine große Hilfe ist. Aber wenn ich auf stype.s
zugreifen, ohne zuerst zu überprüfen, ob type==STARTER
, kann der Compiler nicht intelligent genug sein, um die riskante Codierung zu realisieren, und wird überhaupt nicht warnen.
Kann ich den Code in irgendeiner Weise organisieren, so dass es nicht möglich ist, auf die Mitglieder der U_subtype
Union zuzugreifen, außer an einem sehr begrenzten Ort, wo ich klar dokumentiere, wie der Zugang zu solchen Mitgliedern gemacht werden muss?
Im Wesentlichen sind alle Union-Mitglieder effektiv "int", und die Werte der verschiedenen Enum-Typen wirken auch wie "int" (ihre Verwendung ist nicht auf einen bestimmten Enum-Typ beschränkt , einfach irgendwo, wo ein 'int' funktionieren würde. Wenn Sie jedoch die Vereinigung mit den drei Aufzählungstypen verwenden, können Sie Ihre Absicht veranschaulichen. – Dmitri
Bitte definieren Sie "sicher". C ist schwach typisiert. Wenn Sie eine Garantie benötigen, sollten Sie eine andere Sprache, z. Python. – Olaf
Die beste Methode besteht darin, Funktionen zum Speichern und Zugreifen auf die Mitglieder zu schreiben und den direkten Zugriff auf die Mitglieder zu vermeiden. Die Funktionen können Gültigkeitsprüfungen durchführen. – Barmar