2011-01-25 5 views
5

は言う: -タグ名のない構造体内の構造体の意味は何ですか?私は、コードスニペットに出くわした

struct a { 
    int mem1; 
    char mem2; 

    struct { 
     int inner_mem1; 
     int inner_mem2; 
    }; 
}; 

そして私は、コードスニペットは、直接外側構造体の変数名を使用して、内部構造体のメンバを使用していることを発見しました! 例:

struct a *avar; 
.... 
avar->inner_mem1 

は、コードがしかし、コンパイルし、正常に動作している、この合法的です! このように使用する目的は何ですか? 具体的なシナリオはありますか?

あなたの考えを教えてください。

+0

便利な理由:http://stackoverflow.com/questions/8932707/what-are-anonymous-structs-and-unions-useful-for-in-c11 –

答えて

7

これは「匿名構造」と呼ばれる。

ないタグ付き構造型 の名前メンバーが匿名 構造と呼ばれます。タグのないタイプのユニオン のメンバーは、 匿名ユニオンと呼ばれます。 匿名の構造体または共用体のメンバーは、構造体または共用体を含む のメンバであると見なされる です。この は、構造体または共用体を含む も匿名の場合に再帰的に適用されます。

これは現在のC標準C99の一部ではありませんが、これは今後の予定(上記の引用)の一部であると予想されます。また、多くのコンパイラはすでに拡張機能としてこの機能をサポートしています。

+1

正確に引用していますか?それはCの標準ではないようです。 – Lundin

+1

@ Lundin、私は次の規格のドラフトから引用していました。私の答えにメモを追加しました。 –

+0

その引用はC1Xドラフトからのものです。 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1516.pdf一部のコンパイラはこれを既にサポートしています。この機能はPlan 9 Cコンパイラbtwから提供されています。 – nos

関連する問題