是否有可能(合法)在复合字面常量分配匿名联合?
-
19-09-2019 - |
题
我有一个结构:
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}
的语法是无效的语法;它看起来像你试图使用指定的初始化程序。
不隶属于 StackOverflow