何时将联合嵌套在结构中作为设计选择
When to Nest a union inside a structure as a design choice
这可能是一个天真的问题,我对结构和联合有清晰的想法,并且我已经看到在网络编程和用户界面编程中将联合嵌套在结构中的用法。但是由于这些代码很久以前就有了,我无法弄清楚导致这个决定的设计选择或优势是什么。为什么我要在结构中嵌套一个联合,有什么好处,或者这是遗留的进位 over.The 我看到的代码主要是 C。
示例代码如下所示
typedef struct
{
int address1;
int addresslocation;
int addresstype;
}ITEM;
typedef struct application
{
union
{
ITEM const *arr1;
ITEM *arr2;
}initial_array;
}APPLN;
一般来说,您似乎对联合没有任何担忧,因此不清楚您为什么要询问作为结构成员出现的联合。如果它们通常是有用的数据结构(我认为它们是),那么将它们放在一个结构中并不会降低它们的用处。
事实上,将联合放入结构中可以增加它们的实用性。使用联合的主要限制之一是它们一次只能持有一个成员,并且(有一些警告)您只能读取最近存储的成员。但是怎么知道那是哪个成员呢?一种方法是将联合与另一个成员放在一个结构中,该结构指示哪个联合成员当前包含一个值。这种模式有多种名称,其中包括 "tagged union" 和 "variant record".
但是你问的具体情况比较模糊:
typedef struct application
{
union
{
ITEM const *arr1;
ITEM *arr2;
}initial_array;
}APPLN;
只有一个成员的结构类型的用处非常有限。它与所有其他结构类型具有相同的对齐要求(原则上,这可能与联合的对齐要求不同),因此也许有一个应用程序。另外,如果一个成员是一个数组,那么将它包装在一个结构中允许按值传递和返回它,但你的情况不是这样。
在大多数情况下,与其定义只有一个成员的结构类型,我更愿意直接使用成员的类型。特别是如果我定义一个 typedef
别名来引用类型。
此外,您示例中联合的具体形式有点令人担忧。唯一的成员是指向相同数据类型的 const
和非 const
版本的指针,尤其是没有标记字段的指针,我看到的主要用途是隐藏 non-conforming 程序编译器的操作,以避免实际上有充分理由的警告和/或错误。
这可能是一个天真的问题,我对结构和联合有清晰的想法,并且我已经看到在网络编程和用户界面编程中将联合嵌套在结构中的用法。但是由于这些代码很久以前就有了,我无法弄清楚导致这个决定的设计选择或优势是什么。为什么我要在结构中嵌套一个联合,有什么好处,或者这是遗留的进位 over.The 我看到的代码主要是 C。 示例代码如下所示
typedef struct
{
int address1;
int addresslocation;
int addresstype;
}ITEM;
typedef struct application
{
union
{
ITEM const *arr1;
ITEM *arr2;
}initial_array;
}APPLN;
一般来说,您似乎对联合没有任何担忧,因此不清楚您为什么要询问作为结构成员出现的联合。如果它们通常是有用的数据结构(我认为它们是),那么将它们放在一个结构中并不会降低它们的用处。
事实上,将联合放入结构中可以增加它们的实用性。使用联合的主要限制之一是它们一次只能持有一个成员,并且(有一些警告)您只能读取最近存储的成员。但是怎么知道那是哪个成员呢?一种方法是将联合与另一个成员放在一个结构中,该结构指示哪个联合成员当前包含一个值。这种模式有多种名称,其中包括 "tagged union" 和 "variant record".
但是你问的具体情况比较模糊:
typedef struct application { union { ITEM const *arr1; ITEM *arr2; }initial_array; }APPLN;
只有一个成员的结构类型的用处非常有限。它与所有其他结构类型具有相同的对齐要求(原则上,这可能与联合的对齐要求不同),因此也许有一个应用程序。另外,如果一个成员是一个数组,那么将它包装在一个结构中允许按值传递和返回它,但你的情况不是这样。
在大多数情况下,与其定义只有一个成员的结构类型,我更愿意直接使用成员的类型。特别是如果我定义一个 typedef
别名来引用类型。
此外,您示例中联合的具体形式有点令人担忧。唯一的成员是指向相同数据类型的 const
和非 const
版本的指针,尤其是没有标记字段的指针,我看到的主要用途是隐藏 non-conforming 程序编译器的操作,以避免实际上有充分理由的警告和/或错误。