我有一个结构:

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:在此之前它可能工作。不过,我喜欢有一个匿名的联盟。有没有办法做到这一点?

有帮助吗?

解决方案

匿名联合不是标准的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}的语法是无效的语法;它看起来像你试图使用指定的初始化程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top