2015-12-24 139 views
1

我想知道是否有可能在ANSI C.聲明匿名結構我的代碼是:匿名結構與ANSI C

struct A 
{ 
    int x; 
}; 

struct B 
{ 
    struct A; 
    int y; 
}; 

當我編譯它,我得到: 警告:不申報不申報任何

我已閱讀該標誌-fms-extensions的伎倆,但它僅適用於Windows系統,因爲它產生: 警告:匿名結構是微軟擴展[-Wmicrosoft]

是否有我可以使用的任何ANSI等效擴展?

+0

沒有標識符的'struct'?不,我不這麼認爲。您可以聲明一個沒有類型名稱的'struct',但是帶有'struct {}標識符的標識符''。'struct's'成員具有明確的範圍,那麼如何在沒有標識符的情況下處理成員呢? – Downvoter

+2

ANSI C沒有此功能。你僅限於ANSI C還是可以使用C99或C11? – fuz

+0

我可以使用C99和C11,有沒有解決方案? –

回答

1

了一個小竅門得到幾乎此功能在ANSI C是使用合適的微距:

struct A { 
    int x; 
}; 

struct B { 
    struct A A_; 
    int y; 
}; 

#define bx A_.x 

然後,你可以簡單地做

struct B foo, *bar; 

foo.bx; 
bar->bx; 

在C11雖然,匿名結構都支持你可以簡單地做

struct B { 
    struct { 
     int x; 
    }; 

    int y; 
} 

可惜不是

由於匿名結構必須在結構內聲明,所以它是匿名的。

請參閱this answer瞭解有關C11中匿名成員的更多詳細信息。

0

你想這樣的事情我猜想

struct B { 
    struct { 
     int x; 
    } A; 
    int y; 
}; 

而且你可以這樣做:

struct B b; 
b.A.x = 5; 
printf("%d\n", b.A.x); 
+2

不,這不是匿名的:你仍然必須做'foo.A.x'而不是想要的'foo.x'。 – fuz

+0

這是不可能在C我認爲... – Popiel

+1

[在C11中有可能](https://ideone.com/VKkdGY)。 – jweyrich

2

它可以聲明匿名結構和聯合。 ISO C11增加了這個功能,GCC允許它作爲extension

C11部§6.7.2.1第13段:

一個未命名的部件,它的類型說明符是一個結構說明符沒有標籤被稱爲匿名結構;類型說明符是不帶標籤的聯合說明符的未命名成員稱爲匿名聯合。匿名結構或聯盟的成員被認爲是包含結構或聯盟的成員。如果包含結構或聯合也是匿名的,則這將遞歸應用。

19以下說明匿名結構和聯合:

struct v { 
    union { // anonymous union 
      struct { int i, j; }; // anonymous structure 
      struct { long k, l; } w; 
    }; 
    int m; 
} v1; 

v1.i = 2; // valid 
v1.k = 3; // invalid: inner structure is not anonymous 
v1.w.k = 5; // valid 

現在b可以通過只使用foo.b進行訪問。

+4

您應該澄清,這是C11的新功能,因爲OP在討論ANSI C.並且,謝謝您以簡明的形式複製我的答案的內容。 – fuz

+0

@FUZxxl;在你看來,內容是從你的答案中獲得的,但事實並非如此。我從[這裏](https://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html)中拿出了這個例子,稍作修改。順便說一句,現在改變了整個內容。 – haccks

+1

我不是說你拿我的答案。我說你的答案是多餘的,因爲它說的是我在我的答案中所說的相同的東西(有些簡明)。但無論如何,我不應該在意。 – fuz