假设你正在写一个C struct
它代表一顿饭中的一道菜。课程领域之一struct
属于类型:
enum TP_course {STARTER, MAINCOURSE, DESSERT};
然后,根据课程的类型,您有一个子类型:
enum TP_starter {SALAD, GRILLEDVEGETABLES, PASTA};
enum TP_maincourse {BEEF, LAMB, FISH};
enum TP_dessert {APPLEPIE, ICECREAM, MOUSSE};
鉴于一次只会使用其中一个枚举(取决于课程的类型),因此将它们聚合在一个union
:
union U_subtype {
enum TP_starter s;
enum TP_maincourse m;
enum TP_dessert d;
};
所以课程struct
看起来像这样:
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...
};
好的,一切都清楚了,但是...我可以遵循任何编码策略来尝试强制安全访问stype
上面标记了联盟?也许以某种方式使其不透明?
例如,如果我写一个switch/case
块enum
我忘记写一个case
对于一个值,编译器会触发警告,这对于以后维护代码有很大的帮助。但如果我访问stype.s
无需先检查是否type==STARTER
,编译器不够聪明,无法实现有风险的编码,并且根本不会发出警告。
我能否以某种方式组织代码,以便无法访问 的成员U_subtype
联盟,除非在一个非常有限的地方,我清楚地记录了必须如何访问这些成员?