2011-09-07 56 views
5

我有一個快速question..is有這些有什麼區別:嵌套結構語法

struct myinnerstruct 
{ 
    int x; 

}; 

struct mystruct 
{ 
    struct myinnerstruct m; 
    int y; 
}; 

和本

struct mystruct 
{ 
    int x; 
    struct myinnerstruct 
    { 
     int y; 
    }; 
    struct myinnerstruct m; 
}; 

這些工作都儘可能我可以告訴,但我想知道是否有理由選擇一個或另一個。謝謝

+0

第二個變體是否合法C? –

+0

我還沒有真正能夠在網上找到它的任何例子。我的測試都返回相同的結果。所以AFAIK,它是。 – prelic

+0

下面的內容也會起作用,使第二個縮短一點:struct mystruct {int x; struct myinnerstruct {int y; } m; };恕我直言,在另一個'struct'內定義一個'struct'的最好理由是當內部''struct'被獨佔使用並且可能重複地作爲外部'struct'的成員時,也就是說'struct'必須有許多「團體」爲不同的目的存儲類似的信息。 –

回答

7

區別在於第二個是無效的。

結構聲明中{}之間的內容是一系列成員聲明。您的

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 - 但只有它是成員定義的一部分。我認爲這只是因爲該語言的設計者沒有任何額外的努力來阻止它;這只是其他規則的副作用。你可以做到這一點,但我不推薦它。

+0

所以,如果我想要一個[內部]結構不能被自己聲明(但只能通過外部結構聲明),我應該嵌套定義,但留下一個沒有標籤的內部結構,如你的例子? – prelic

+0

@prelic:這取決於。爲什麼你首先需要一個內部結構?在您向我們展示的(可能是)簡化代碼中,只有一個'struct innerstruct'實例,它是'struct mystruct'的成員。爲什麼不平坦化結構,以便'struct innerstruct'的成員變成'struct mystruct'的直接成員?我不一定說這是正確的解決方案,但知道爲什麼不是(如果不是),將有助於確定如何解決實際問題。 –

+0

是的,我在這個例子中意識到,扁平我的結構是微不足道的。但是,我實際上在應用這一點,並不是那麼清楚。我與(合理的)大型結構一起工作,這些結構構成了更大的結構。無論組件結構在結構集外是否可見,這都很重要。 – prelic

1

選擇一個或其他的理由是傳統的期望。

嵌套在另一箇中的結構聲明不會在別處被重用,即使它可以。

另外,由於沒有將相同抽象級別的東西並排放置,所以會產生心理衝突。這樣做是完全合法的,但它會讓代碼變得更難以理解,也許更令人惱火。