2009-12-11 29 views
5

我有一个结构:是否有可能(合法)在复合文字中分配匿名联合?

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

当我尝试指派复合文字,如:

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

海湾合作委员会给了我一些警告,如:

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 

我看了,如果我i:之前把(union <union name>)那么它可能工作。但是,我更喜欢有一个匿名的联盟。有没有办法做到这一点?

回答

7

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

+0

第一次看到它让我感到吃惊,但对于GCC来说,这实际上是合法的(虽然不赞成使用)指定的初始化语法。 – ephemient 2009-12-11 05:39:22

+0

(我猜不推荐)初始化语法是通过阅读某些内核模块代码得到的。'fops'结构通常是这样写的。我现在要切换到C99的方式。对于匿名工会来说太糟糕了,我不知道他们不是标准的,谢谢你帮我清理这些。 – Steve 2009-12-11 13:58:14