2011-09-07 18 views
5

私はそこに迅速question..isこれらの違いがあります。これらの私の知る限り動作しますが、私は両方の入れ子構造構文

struct myinnerstruct 
{ 
    int x; 

}; 

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

AND THIS

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

をどちらか一方を選択する理由があるのか​​疑問に思う。おかげ

+0

第2の亜種も法的にCですか? –

+0

私は実際にオンラインの例を見つけることができませんでした。両方のテストで同じ結果が返されます。だからAFAIK、そうです。 – prelic

+0

次のコードはもう少し短くするためにも動作します: 'struct mystruct {int x;構造体myinnerstruct {int y; } m; }; 'IMHO、別の' struct'の中で 'struct'を定義する最善の理由は、内側の' struct'が排他的に使用され、おそらく外側の 'struct'のメンバーとして繰り返し使用される場合です。異なる目的のために同様の情報を格納する多くの「グループ」を持つ。 –

答えて

7

違いは、第1が無効であることです。

構造体宣言内の{ととの間のものは、メンバー宣言のシーケンスです。あなたの

struct myinnerstruct 
    { 
     int y; 
    }; 

は型宣言です。それは囲む構造体のメンバーを宣言していないので、その文脈では違法です。

何を行うことができますすると、このです:

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

mの宣言は、メンバ宣言であるので、それは大丈夫です。タイプstruct myinnerstructも宣言します。しかし、私の意見では、それは貧しいスタイルです。タイプstruct myinnerstructは、struct mystructの宣言が完了した後でも表示されます。以下の説明を参照してください。

あなたが本当にそのような構造体の中の構造体をしたい、とあなたはどこか他のstruct myinnerstructを使用するつもりはない場合、あなたはタグなしでそれを残すことができます:

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

しかし、その後、あなたは同様に宣言するかもしれませんyのメンバーはstruct mystructです。

あなたはstruct innerstructは、名前付きの型になりたい場合は、あなたの最初の例で行ったように、ただ、別にそれを宣言。

の理由は、struct innerstructが引き続き表示されます。

C99 standard(大PDF)、セクション6.2.1段落2、言う:識別子が指定それぞれ異なるエンティティの

、 識別子(すなわち、使用することができる)だけ可視あります プログラムテキストの領域内ではスコープと呼ばれます。同じ識別子によって によって指定された異なるエンティティは、異なるスコープを持つか、別の名前の スペースになります。スコープには4つの種類があります:function、file、block、 function prototypeです。 (関数プロトタイプは、そのパラメータのタイプを宣言 関数の宣言である。)

C90及びC11規格は、本質的に同じ文言を有します。

{構造体宣言の中の中括弧}は、ブロックを定義したり、スコープの他の種類を定義したりしないため、中括弧の間に宣言されたものはすべてその領域にスコープされません。周囲の状況に応じたスコープにする必要があります。構文によって、struct myinnerstructを別の構造体定義の中に宣言できます。ただし、それがメンバー定義の一部である場合に限ります。私はこれが許されているのは、言葉のデザイナーがそれを許さないために余計な努力をしなかったからです。他のルールの副作用に過ぎません。あなたはできますそれを行うが、私はそれをお勧めしません。

+0

したがって、自分自身で宣言できなかった(内部構造体で宣言するだけで)[inner]構造体が必要だった場合、定義を入れ子にする必要がありますが、例のようにタグなしで内部構造体を残してください? – prelic

+0

@prelic:それは依存します。なぜ内部構造体が最初に必要なのですか?あなたが私たちに示した(おそらく)単純化されたコードでは、 'struct innerstruct'のインスタンスは1つしかなく、' struct mystruct'のメンバーです。 'struct innerstruct'のメンバーが' struct mystruct'の直接のメンバーになるように、構造を平坦化してみませんか?私はそれが正しい解決策であるとは必ずしも言えませんが、実際の問題を解決する方法を決定するのに役立つのはなぜではないのかを知ることではありません。 –

+0

ええ、私はこの例では、私の構造を平らにすることは自明です。しかし、私が実際にこれを適用しているところでは、それは明確なカットではありません。私は(合理的に)大きな構造を扱い、これらの構造はより大きな構造を作ります。コンポーネント構造が構造のセットの外側に見えるかどうかは重要です。 – prelic

1

理由は、いずれかを選択するか、または他の従来の期待だろう。別内にネスト

構造の宣言は、それができるにもかかわらず、他の場所で再利用されることが期待されないであろう。

また、抽象サイド・バイ・サイドの同じレベルのものを入れないことで心理的な衝突があります。それは完全に合法ですが、コードの理解を少し難しくし、おそらくもっと刺激します。