gpt4 book ai didi

c - C1X 中匿名结构或 union 的初始化

转载 作者:太空狗 更新时间:2023-10-29 16:28:54 25 4
gpt4 key购买 nike

我有以下问题:如何根据当前 C1X draft 正确初始化匿名结构(或 union ) ?这是否合法:

struct foo {
int a;
struct {
int i;
int j;
};
int b;
};

struct foo f = { 1, 2, 3, 4 };
struct foo g = { 1, { 2 }, 3 };

在 GCC 中,g.j == 0g.b == 3,而在 tcc 中,g.j == 3g.b = = 0。目前的草案说:

"[...] unnamed members of objects of structure and union type do not participate in initialization. Unnamed members of structure objects have indeterminate value even after initialization.".

这是真的吗?不是

struct foo h = { 0 };

应该将所有成员设置为0?

非常感谢!

更新:

由于匿名成员似乎只有在混合结构/union 时才有用,如何正确初始化:

struct bar {
int tag;
union {
double d;
int i;
};
};

?这会在 gcc < 4.6 和 icc 11 中产生错误,但在 gcc 4.6、icc 12、clang 和 tcc 中有效:

struct bar a = { .tag = 1, .i = 42 };

这在 clang 和 tcc 中会出错,但在 gcc 和 icc 中有效:

struct bar b = { .tag = 1, { .i = 42 } };

第二个是否违反标准?

最佳答案

fh 应该正确初始化所有成员,因为 ij 将被视为成员struct foo(C1x 6.7.2.1 §13)的:

The members of an anonymous structure or union are considered to be members of the containing structure or union.

考虑到 C1x 6.7.9 §9,我认为 gcc 对 g 的初始化是不正确的:

Except where explicitly stated otherwise, for the purposes of this subclause unnamed members of objects of structure and union type do not participate in initialization.

§20 - 处理子聚合 - 不包含与该问题相关的明确声明,所以我最好的猜测是 §9 适用(但仅适用于聚合本身,成员(member)!)。

底线是匿名子聚合不作为单独的对象存在,即 tcc 的行为应该是正确的...

我对这个问题的看法示例代码:

struct foo
{
struct bar { int i; }; // (1) unnamed, but tagged, ie *not* anonymous
struct { int j; }; // (2) unnamed, but anonymous
struct { int k; } baz; // (3) named, but not tagged
};

(1) 不参与初始化,(2) 初始化就像 struct foo 有一个名为 j 的额外成员一样,(3) 初始化为常规子聚合。

如果我的解释是正确的,匿名结构只有包含在 union 中才有意义:结构中的匿名结构与包含其他成员的平面结构没有区别。

关于c - C1X 中匿名结构或 union 的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5063548/

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