gpt4 book ai didi

嵌套在 union 中的结构中的公共(public)初始序列 - C 标准中的定义

转载 作者:行者123 更新时间:2023-12-04 18:13:25 26 4
gpt4 key购买 nike

在 C11 标准中,嵌套在单个 union 中的结构共享的公共(public)初始序列定义如下:

6.5.2.3/6

One special guarantee is made in order to simplify the use of unions: if a union contains several structures that share a common initial sequence (see below), and if the union object currently contains one of these structures, it is permitted to inspect the common initial part of any of them anywhere that a declaration of the completed type of the union is visible. Two structures share a common initial sequence if corresponding members have compatible types (and, for bit-fields, the same widths) for a sequence of one or more initial members.

EXAMPLE 3 The following is a valid fragment:

union {
struct {
int alltypes;
} n;

struct {
int type;
int intnode;
} ni;

struct {
int type;
double doublenode;
} nf;
} u;

u.nf.type = 1;
u.nf.doublenode = 3.14;
/* ... */
if (u.n.alltypes == 1)
if (sin(u.nf.doublenode) == 0.0)
/* ... */


但是根据我对这篇文章的理解,上面的代码是无效的。

在外 if声明我们指出 n::alltypes数据成员处于事件状态(同时与 ni::typenf::type 作为标准状态)但在内部 if我们使用 nf::doublenode这不是公共(public)初始序列的一部分。

有人可以澄清这个问题吗?

最佳答案

it is permitted to inspect the common initial part of [several structures that share a common initial sequence]



使用提供的示例,规范的这一部分是说,由于 union 的每个可能的成员类型都有一个 int 作为初始字段,因此您可以使用任何成员类型访问该公共(public)初始字段,即使在变量已经初始化之后/用作特定成员类型之一。

这正是示例所做的:在将以下字段初始化为 int 之后,它访问初始 alltypes 作为 n 的成员 nf ,然后继续访问 doublenodenf 字段,所有这些都使用相同的变量。

使用 union 作为一种可能的类型不会强制它进入某种结构:这就是 union 的​​工作方式。

请注意,此保证已经存在了一段时间:在 ANSI specification 部分:3.3.2.3 结构和 union 成员中找到了基本相同的文本。

关于嵌套在 union 中的结构中的公共(public)初始序列 - C 标准中的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com