gpt4 book ai didi

c - 是否可以(合法)在复合文字中分配匿名 union ?

转载 作者:太空狗 更新时间:2023-10-29 14:59:59 29 4
gpt4 key购买 nike

我有一个结构:

typedef struct _n
{
int type;
union {
char *s;
int i;
};
} n;

当我尝试分配复合文字时,例如:

node n1 = {1, 0};
node n2 = {2, "test"};

gcc 给我一些警告,例如:

warning: initialization makes pointer from integer without a cast
warning: initialization from incompatible pointer type

嗯,很明显,编译器不确定我是否只是将值分配给可能不明确的类型。但是,即使我尝试更准确地指定:

node n0 = {type: 1, i: 4};

我得到:

error: unknown field ‘i’ specified in initializer

我读过如果我把 (union <union name>)之前i:那么它可能会起作用。但是,我更喜欢匿名 union 。有办法吗?

最佳答案

匿名 union 不是标准 C——它们是编译器扩展。我强烈建议给 union 起个名字。如果你坚持使用匿名 union ,那么你只能给它的第一个元素一个初始化:

node n0 = {1, 0};  // initializes `s' to 0

当使用 -Wall -Wextra -pedantic 编译时,gcc 给了我警告“初始化程序周围缺少大括号”,这是一个有效的警告。初始化器实际上应该像这样指定:

node n0 = {1, {0}};  // initializes `s' to 0

现在这只会给出警告“ISO C 不支持未命名的结构/union ”。

如果您为 union 命名,则可以使用称为指定初始化器 的 C99 功能来初始化 union 的特定成员:

typedef struct
{
int type;
union {
char *s;
int i;
} value;
} node;

node n0 = {1, { .s = "string" }};
node n1 = {2, { .i = 123 }};

你需要 union 有一个名字;否则,编译器会提示其中的指定初始化程序。

您尝试使用的语法 node n0 = {type: 1, i: 4} 是无效语法;看起来您正在尝试使用指定的初始值设定项。

关于c - 是否可以(合法)在复合文字中分配匿名 union ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1885854/

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