无名结构体和联合体(struct&union)

本文介绍了C语言中匿名联合和结构体的使用,这种特性允许在不创建独立变量的情况下嵌套结构体或联合体,从而节省内存。通过匿名联合,可以直接通过结构体访问其内部的变量,提高了代码的简洁性和访问效率。C11标准中正式引入了这一特性,使得在结构体中嵌套匿名联合成为一种强大的工具。

记得之前在哪里看到了如下形式的结构体和联合体的命名方式;
union
{
char alpha;
int num;
};
struct
{
char alpha;
int num;
};

因为写代码的时候用到了,在外网上找了点资料,把这个点记下来;

Anonymous unions/structures are also known as unnamed unions/structures as they don’t have names. Since there is no names, direct objects(or variables) of them are not created and we use them in nested structure or unions.
Definition is just like that of a normal union just without a name or tag.

这个特性是为了在struct 和union嵌套的时候访问变量更加容易,而在C 11当中添加的。
struct Scope {
// Anonymous union
union {
char alpha;
int num;
};
};

如上,使用union节省了内存,而且在访问的时候直接通过struct 可以指向union中的变量。

十分好用。

在C语言中,结构体struct联合体union)可以互相嵌套定义。例如,可以在结构体中定义联合体,也可以在联合体中定义结构体。这种嵌套定义的语法在标准C中是允许的,且在很多实际应用中非常常见。 然而,根据GJB8114-2013标准,**禁止使用无名结构体(unnamed struct)或无名联合体(unnamed union)**。无名结构体联合体指的是没有标签(tag)且在定义时未直接声明变量的结构体联合体。例如: ```c struct { int a; float b; }; // 无名结构体,GJB8114-2013中禁止使用 ``` 对于用户提出的问题:“结构体中定义联合体联合体中定义结构体是否符合GJB8114-2013关于无名结构体的限制”,答案取决于嵌套结构中是否使用了无名结构体联合体### 合法示例(符合GJB8114-2013) 以下代码在结构体中定义了联合体,并且联合体结构体都有标签(tag),因此是**符合GJB8114-2013**的: ```c union InnerUnion { int i; float f; }; struct OuterStruct { int a; union InnerUnion u; // 合法,InnerUnion有标签 }; ``` 同样,以下代码在联合体中定义了结构体,且结构体有标签,也符合GJB8114-2013: ```c struct InnerStruct { int x; int y; }; union OuterUnion { int a; struct InnerStruct s; // 合法,InnerStruct有标签 }; ``` ### 非法示例(违反GJB8114-2013) 如果嵌套定义中使用了无名结构体无名联合体,则不符合GJB8114-2013标准。例如: ```c struct OuterStruct { int a; union { // 无名联合体,违反GJB8114-2013 int i; float f; }; }; ``` 该结构体中嵌套了一个无名联合体,由于没有标签,这将违反GJB8114-2013中对无名结构体/联合体的禁止规定。 ### 总结 - 如果嵌套定义的结构体联合体都有明确的标签(tag),则**符合GJB8114-2013**。 - 如果使用了无名结构体无名联合体,则**不符合GJB8114-2013**标准[^1]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值