何时在结构内嵌套活接作为设计选择

时间:2019-06-14 12:23:49

标签: c user-interface design-patterns network-programming

这可能是一个幼稚的问题,我对结构和联合有清晰的想法,并且我已经看到在网络编程和用户界面编程中将联合嵌套在结构内的用法。但是由于这些代码早已存在,所以我无法弄清楚导致该决定的设计选择或优势。我为什么要在结构中嵌套一个并集,这会有什么好处,或者这是一个遗留物?我所看到的代码主要是C。 示例代码如下:

typedef struct   
{  
int address1;  
int addresslocation;  
int addresstype;  
}ITEM;  

typedef struct application  
{   
    union  
    {  
        ITEM const *arr1;  
        ITEM *arr2;  
    }initial_array;  
}APPLN;  

1 个答案:

答案 0 :(得分:2)

您似乎总体上对工会没有任何担心,因此不清楚您为什么要问工会以结构成员的身份出现。如果它们通常是有用的数据结构(我认为它们是有用的),那么将它们放在结构中并不会降低其有用性。

实际上,将并集放入结构可以增加其作用。使用联合的主要限制之一是,它们一次只能容纳一个成员,并且(有一些警告)您只能读取最近存储的成员。但是,如何知道是哪个成员呢?一种方法是将联合与另一个成员放入一个结构中,该成员指示当前哪个联合成员包含一个值。这种模式具有各种名称,其中包括“标记的联合”和“变体记录”。

但是您询问的具体情况比较暗淡:

typedef struct application  
{   
    union  
    {  
        ITEM const *arr1;  
        ITEM *arr2;  
    }initial_array;  
}APPLN;

只有一个成员的结构类型的用途非常有限。它具有与所有其他结构类型相同的对齐要求(原则上,它可能与联合的对齐要求不同),因此也许有一个应用。另外,如果一个成员是数组,则将其包装在结构中允许按值传递和返回它,但这不是您的情况。

在大多数情况下,我宁愿直接使用成员的类型,而不是只定义一个成员的结构类型。尤其是这样,如果我要定义一个typedef别名来引用该类型。

此外,示例中的工会的具体形式有点令人担忧。唯一的成员是指向同一数据类型的const和非const版本的指针,尤其是在没有标签字段的情况下,我看到的主要用途是隐藏不符合标准的程序动作编译器,以避免出现警告和/或错误,而这些警告和/或错误实际上是合理的。