2016-09-23 22 views
-1

以下の2つの方法で構造体を構築しました(図A &図B)。私の.cファイルでは、私はそのような構造体にアクセスします(図C)。Cの構造体定義のバリエーション

なぜ、図Aが図Cによってアクセスされたときに図Aがコンパイラエラーを起こすのか説明してください。また、図Cを使用してアクセスすると図Bがコンパイラエラーを引き起こさないのはなぜですか?図

構造体が内部で使用されている場合、名前は構造体の上部と下部の2つの場所にある必要があります。

コンパイラの「前方参照」に関連していますか?良い説明をいただければ幸いです。スニペットAにおいて

//Fig. A 
typedef struct 
{ 
    uint32_t* block_address; 
    struct mem_table_entry_t* next_entry_ptr; 

}mem_table_entry_t; 

typedef struct 
{ 
    mem_table_entry_t two_kib[8]; 

}mem_table_t; 

//Fig. B 
typedef struct mem_table_entry_t 
{ 
    uint32_t* block_address; 
    struct mem_table_entry_t* next_entry_ptr; 

}mem_table_entry_t; 

typedef struct 
{ 
    mem_table_entry_t two_kib[8]; 

}mem_table_t; 

...

//Fig. C 
memory_table.two_kib[block].next_entry_ptr = &memory_table.two_kib[block+1]; 
+0

スニペットBがコンパイルされていますか? –

+1

コンパイラのエラーを教えてください! –

+0

私は、コンパイラが 'typedef struct T1 {...} T2;' T1とT2が 'T0 'に置き換えられても、構造体T1とT2が同じではないと感じていると考えます。 。 – alk

答えて

2

structタグの名前空間内の[まだ]定義されstruct mem_table_entry_tは存在しません。したがって、struct mem_table_entry_t* next_entry_ptr;のように参照することはできません。

あなたのスニペットBは正しいです。

typedef名前空間は、structタグ名前空間とは異なります。つまり、次のものは互換性がありません。

mem_table_entry_t two_kib1[8]; 
struct mem_table_entry_t two_kib2[8]; 
+0

私は正直、私はまだ「typedefは構造体」と単に「構造体」の違いを知らない。 – Darrell

+0

'typedefは... t_newtype'はt_newtype'は何である' ... 'として定義された新しいタイプである'宣言しています。 ' struct {...} a'は構造体である変数 'a'を宣言します。 –

+0

@Darrel:あなたの心から' typedef'を打ち破って幸せになれます。構造体を定義するには 'struct S {...};'を実行し、変数を定義するには 'struct S s;'を実行します。 – alk

関連する問題