2009-12-11 31 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