“union 声明”指定一组变量值,并且可以选择指定一个标记来命名联合。 变量值称为联合的“成员”,可以具有不同的类型。 联合类似于其他语言的“变体记录”。
语法
struct-or-union-specifier:
struct-or-union
identifier
选择{struct-declaration-list}
struct-or-union
identifier
struct-or-union:
struct
union
struct-declaration-list:
struct-declaration
struct-declaration-list
struct-declaration
将联合内容定义为
struct-declaration:
specifier-qualifier-list
struct-declarator-list
;
specifier-qualifier-list:
type-specifier
specifier-qualifier-list
选择
type-qualifier
specifier-qualifier-list
选择
struct-declarator-list:
struct-declarator
struct-declarator-list
,
struct-declarator
具有 union 类型的变量存储该类型定义的值之一。 相同的规则管理结构和联合声明。 联合还可以具有位字段。
联合的成员不能具有不完整的类型、类型 void或函数类型。 因此,成员不能是联合的实例,但可以是指向要声明的联合类型的指针。
联合类型声明只是模板。 在声明变量之前,不会保留内存。
注释
如果声明了两种类型的并集,并且存储了一个值,但使用另一种类型访问联合,则结果不可靠。 例如,声明并floatint已声明联合。 存储一个 float 值,但程序稍后会以一个值 int的形式访问该值。 在这种情况下,该值将取决于值的内部存储 float 。 整数值不可靠。
例子
下面是联合的示例:
union sign /* A definition and a declaration */
{
int svar;
unsigned uvar;
} number;
此示例定义一个类型 sign 为联合变量,并声明一个名为具有两个成员的 number 变量: svar一个有符号整数和 uvar一个无符号整数。 此声明允许将当前值 number 存储为有符号值或无符号值。 与此联合类型关联的标记为 sign。
union /* Defines a two-dimensional */
{ /* array named screen */
struct
{
unsigned int icon : 8;
unsigned color : 4;
} window1;
int screenval;
} screen[25][80];
该 screen 数组包含 2,000 个元素。 数组的每个元素都是具有两个成员的单个联合: window1 和 screenval。 该 window1 成员是一个包含两个位字段成员的结构, icon 以及 color。 该 screenval 成员是一个 int。 在任何给定时间,每个联合元素都保留 int 表示者 screenval 或由其 window1表示的结构。
Microsoft 专用
当嵌套联合是另一个结构或联合的成员时,可以匿名声明嵌套联合。 下面是无名称联合的示例:
struct str
{
int a, b;
union /* Unnamed union */
{
char c[4];
long l;
float f;
};
char c_array[10];
} my_str;
.
.
.
my_str.l == 0L; /* A reference to a field in the my_str union */
联合通常嵌套在一个结构中,该结构包含一个字段,用于在任何特定时间提供联合中包含的数据类型。 下面是此类联合声明的示例:
struct x
{
int type_tag;
union
{
int x;
float y;
}
}
有关引用联合的信息,请参阅 结构和联合成员 。
结束 Microsoft 专用