區別在於第二個是無效的。
結構聲明中{
和}
之間的內容是一系列成員聲明。您的
struct myinnerstruct
{
int y;
};
是一種類型聲明;它沒有聲明封閉結構的成員,所以在這種情況下它是非法的。
什麼你可以做的是:
struct mystruct
{
int x;
struct myinnerstruct
{
int y;
} m;
};
的m
的聲明是一個成員聲明,所以它的確定;它還聲明瞭類型struct myinnerstruct
。但在我看來,這是不好的風格。在struct mystruct
的聲明完成後,struct myinnerstruct
類型仍然可見;請參閱下面的解釋。
如果你真的想這樣的一個結構內的結構,而你不打算使用struct myinnerstruct
其他地方,你可以離開它沒有一個標籤:
struct mystruct
{
int x;
struct
{
int y;
} m;
};
但你還不如申報y
作爲struct mystruct
的成員。
如果你想讓struct innerstruct
成爲一個命名類型,只需單獨聲明它,就像你在第一個例子中一樣。
下面是對的解釋,爲什麼struct innerstruct
仍然可見。
的C99 standard(大PDF),第6.2.1節第2段表示:
對於標識符指定每個不同實體,所述 標識符只(即,可以使用)是可見在 區域內的程序文本稱爲其範圍。由 指定的不同實體相同的標識符或者具有不同的範圍,或者以不同的名稱 空格。函數原型有四種類型的函數:函數,文件,塊和 。 (A 函數原型是 函數聲明的類型的其參數的聲明。)
的C90和C11的標準具有基本上相同的措辭。
{
大括號}
在結構聲明中沒有定義塊,也沒有定義任何其他可能的範圍,因此大括號之間聲明的任何內容都不在該範圍內;它必須限定在某些周圍的環境中。碰巧語法允許你在另一個結構定義中聲明struct myinnerstruct
- 但只有它是成員定義的一部分。我認爲這只是因爲該語言的設計者沒有任何額外的努力來阻止它;這只是其他規則的副作用。你可以做到這一點,但我不推薦它。
第二個變體是否合法C? –
我還沒有真正能夠在網上找到它的任何例子。我的測試都返回相同的結果。所以AFAIK,它是。 – prelic
下面的內容也會起作用,使第二個縮短一點:struct mystruct {int x; struct myinnerstruct {int y; } m; };恕我直言,在另一個'struct'內定義一個'struct'的最好理由是當內部''struct'被獨佔使用並且可能重複地作爲外部'struct'的成員時,也就是說'struct'必須有許多「團體」爲不同的目的存儲類似的信息。 –