7

我有一个结构:

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:,它可能会起作用。但是,我更喜欢匿名工会。有没有办法做到这一点?

4

1 回答 1

9

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

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

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

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

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

如果您给联合命名,那么您可以使用称为指定初始化程序的 C99 功能来初始化联合的特定成员:

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}的语法无效;看起来您正在尝试使用指定的初始化程序。

于 2009-12-11T05:18:58.953 回答