我想知道是否有可能在ANSI C.聲明匿名結構我的代碼是:匿名結構與ANSI C
struct A
{
int x;
};
struct B
{
struct A;
int y;
};
當我編譯它,我得到: 警告:不申報不申報任何
我已閱讀該標誌-fms-extensions
的伎倆,但它僅適用於Windows系統,因爲它產生: 警告:匿名結構是微軟擴展[-Wmicrosoft]
是否有我可以使用的任何ANSI等效擴展?
我想知道是否有可能在ANSI C.聲明匿名結構我的代碼是:匿名結構與ANSI C
struct A
{
int x;
};
struct B
{
struct A;
int y;
};
當我編譯它,我得到: 警告:不申報不申報任何
我已閱讀該標誌-fms-extensions
的伎倆,但它僅適用於Windows系統,因爲它產生: 警告:匿名結構是微軟擴展[-Wmicrosoft]
是否有我可以使用的任何ANSI等效擴展?
了一個小竅門得到幾乎此功能在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中匿名成員的更多詳細信息。
它可以聲明匿名結構和聯合。 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
進行訪問。
沒有標識符的'struct'?不,我不這麼認爲。您可以聲明一個沒有類型名稱的'struct',但是帶有'struct {}標識符的標識符''。'struct's'成員具有明確的範圍,那麼如何在沒有標識符的情況下處理成員呢? – Downvoter
ANSI C沒有此功能。你僅限於ANSI C還是可以使用C99或C11? – fuz
我可以使用C99和C11,有沒有解決方案? –