首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以(合法)在复合文字中分配匿名联合?

是否可以(合法)在复合文字中分配匿名联合?
EN

Stack Overflow用户
提问于 2009-12-11 12:55:00
回答 1查看 3.7K关注 0票数 7

我有一个结构体:

代码语言:javascript
复制
typedef struct _n
{
    int type;
    union {
        char *s;
        int i;
    };
} n;

当我尝试赋值复合文字时,例如:

代码语言:javascript
复制
node n1 = {1, 0};
node n2 = {2, "test"};

gcc给了我一些警告,比如:

代码语言:javascript
复制
warning: initialization makes pointer from integer without a cast
warning: initialization from incompatible pointer type

很明显,编译器并不确定我只是给一个可能有歧义的类型赋值。然而,即使我尝试更精确地指定:

代码语言:javascript
复制
node n0 = {type: 1, i: 4};

我得到了:

代码语言:javascript
复制
error: unknown field ‘i’ specified in initializer

我读到过,如果我把(union <union name>)放在i:之前,那么它可能会起作用。然而,我更喜欢有一个匿名联盟。有办法做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-12-11 13:18:59

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

代码语言:javascript
复制
node n0 = {1, 0};  // initializes `s' to 0

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

代码语言:javascript
复制
node n0 = {1, {0}};  // initializes `s' to 0

现在,这只会给出一个警告:"ISO C不支持未命名的结构/联合“。

如果您为联合指定了一个名称,那么您可以使用称为指定初始化器的C99功能来初始化联合的特定成员:

代码语言:javascript
复制
typedef struct
{
    int type;
    union {
        char *s;
        int i;
    } value;
} node;

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

您需要联合有一个名称;否则,编译器会抱怨它内部的指定初始化器。

您尝试使用的node n0 = {type: 1, i: 4}语法是无效语法;看起来您试图使用指定的初始化器。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1885854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档