2016-09-10 10 views
3

私の構造体宣言の抜粋:Cの構造体、不完全なフィールドタイプ

struct record{ 
    char type[4]; 
    uint32_t data_size; 
    uint32_t flags; 
    uint32_t id; 
    uint32_t revision; 
    uint16_t version; 
    uint16_t unknown; 
    uint8_t *data; 
}; 

struct group; 

union subgroup_record{ 
    int type; 
    struct group subgroup; 
    struct record record; 
}; 

struct record_list{ 
    union subgroup_record subgroup_record; 
    struct record_list *next; 
}; 

struct group{ 
    char type[4]; 
    uint32_t group_size; 
    uint8_t label[4]; // depends on group_type 
    int32_t group_type; 
    uint16_t stamp; 
    uint16_t unknown1; 
    uint16_t version; 
    uint16_t unknown2; 
    struct record_list record_list; 
}; 

struct group_list{ 
    struct group group; 
    struct group_list *next; 
}; 

struct plugin{ 
    struct record header; 
    struct group_list top_groups; 
}; 

コンパイラは、私は、このエラーを与える:構造体を宣言

error: field ‘subgroup’ has incomplete type 

フォワードはtypedef'ing、助けにはなりませんでした構造体の宣言を変更しても助けにならなかったので、私はどこでもポインタを持たないだろう(初心者のために、メモリの割り当てと解放はちょっと怖い)

これに対する解決策はありますか?

ありがとうございます!

+1

_Side note: 'subgroup_record'には' int type'がありますが、これは他の 'union'メンバの' type'定義と互換性がある 'char type [4]'でなければなりません]。重大ではない、あるいは間違っているだけです。 –

+0

'struct record_list record_list;' - > 'struct record_list * record_list;' '*'を追加してください。 – chux

答えて

2

あなたには循環的な再帰的定義があります。

タイプstruct groupは、型自体を含むことができないタイプstruct group

を含む型union subgroup_recordを含むタイプstruct record_listを含んでいます。

+0

しかし、良い答えは、実際の型の代わりにポインタを使用して問題を解決する例を追加することを検討します...? – Myst

+0

@Myst重要だと思われる場合は、あなた自身の回答を追加することができます。 – 2501

+0

私は1つの良い答えを持つことは、将来の読者にとっては良いことだと思います。あなたのものは、すでに問題に遭遇している人には十分です(したがって、私はそれを賞賛しました)。このコメントは示唆であり、今後の読者がコードに実装するためのものです。 – Myst

関連する問題