union
声明
“联合声明”指定一组变量值和(可选)一个命名联合的标记。 变量值称为联合的“成员”,并且可以具有不同的类型。 联合类似于其他语言中的“变体记录”。
语法
struct-or-union-specifier
?
struct-or-union
identifier
opt{
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
opt
type-qualifier
specifier-qualifier-list
opt
struct-declarator-list
?
struct-declarator
struct-declarator-list
,
struct-declarator
具有 union
类型的变量存储此类型所定义的值之一。 相同的规则可控制结构和联合声明。 联合还可以具有位域。
联合成员不能具有不完整类型、类型 void
或函数类型。 因此,成员不能是联合的实例,但可以是指向将声明的联合类型的指针。
联合类型声明只是一个模板。 在声明变量之前,不保留内存。
注意
如果声明两个类型的联合并存储一个值,但使用其它类型访问该联合,则结果是不可靠的。 例如,声明了 float
和 int
的联合。 存储 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 专用