工会内的工会

在C中,是否可以在另一个联合中定义联合? 如果不是,为什么不可能? 或者,如果是,可以在哪里使用?

假设您要定义:

union myun { int x; sometype y; }; 

其中sometype是由您正在使用的库定义的typedef 。 如果库碰巧将它实现为一个联合类型,那么这将是一个联合内部的联合,它会有意义,因为你不能(从一个好的设计角度来看)违反了库类型的封装。

是的,这是可能的,也是有用的。 原因与Y中的X对X和Y的许多值有用的原因相同:组合性。 程序是通过将微小组件组装成小组件组成更大的组件而构建成大型组件而构建的……有时候,一堆联盟恰好被组装成一个联合,那么呢?

R ..的答案显示了一个在幕后发生这种情况的例子:它恰好发生了一个联合成员类型是一个联合,但除非你看一下库实现,否则你不知道。


编辑但是,请注意区分联合的常用习惯用法,其中联合的每个成员是第一个字段是包含标记的整数类型的结构,但不扩展到嵌套联合。 也就是说,以下是C中受歧视联合的通用,符合标准(N1256§6.5.2.3.5)的实现:

 struct generic { unsigned tag; }; struct smallnum { unsigned tag; /*always TAG_SMALLNUM*/ unsigned value; }; struct bignum { unsigned tag; /*always TAG_BIGNUM*/ size_t length; unsigned *p; }; struct string { unsigned tag; /*always TAG_STRING*/ size_t length; char *p; }; union number { struct bignum bignum; struct smallnum smallnum; }; union object { struct generic generic; struct bignum bignum; struct smallnum smallnum; struct string string; }; 

如果你有一个union object x ,你可以随时将它的标签读作x.generic.tag (或x.bignum.tag或其他任何对象),无论实际分配给对象的是什么。 通过对对象使用唯一标签(鉴别器)。

以下定义是合法的,但没有用,因为您不能只读取union level2对象的第一个字段来获取标记:如果union level2对象被写为union number ,则必须通过number成员读取其标记,否则你必须通过genericstring成员读取它的标记。 如果通过错误的成员访问每个现有的实现,我不会感到惊讶,但它不符合标准。

 union level2 { struct generic generic; union number number; struct string string; }; 

对的,这是可能的。 但我倾向于坚持从不使用工会的建议。 工会是正确答案的情况非常少。 我怀疑没有包含工会的工会是个好主意的情况。

对的,这是可能的。 虽然很容易想出一个人为的例子,但我无法想到能够很好地利用我的头脑。

是的,工会可能包含另一个工会:

 union foo { int x; double y; union bar { char blah[10]; char *blurga; } bletch; }; 

但是,我想不出它会有用(甚至是可取的)的情况。