2017-06-22 3 views
-2

私はCでゲームを作成していますが、いくつかのエラーが発生しています。 1つの顕著なものがこれです。 "Illegal Identifier:X"ここで、Xは構造体内の変数の型です。例えば、不正な識別子:MapItemは、エラーがMapTile構造体内部の最初の行に取り付けられている次のコードVisual C 2012:奇妙なエラーが発生しています。コードセグメントとエラーが提供されました

typedef struct MapItem{ 
int item; 
int count; 
}; 

typedef struct MapTile{ 
MapItem item; 
int x; 
int y; 
int tile; 
Direction dir; 
int drop; 
}; 

によって引き起こされます。私はこのエラーがなぜ発生しているのか、どのように修正するのかを知りたい。

コードセグメントは、正確な順序でmap.hから取得されました。 Directionは同じヘッダーの前に宣言された列挙型です。

ありがとうございます。しかし、私は4時間前に必要な答えを受け取りました。

+0

あなたのtypedefには実際の型名がありません! –

+0

有効なCコードを書く代わりに、C++コンパイルを使用し、 'typedef'キーワードを削除することが少し手間がかかります。 – Clifford

+0

' typedef'を使用しないでください!それ以上の文字を入力する必要はありません。 – pmg

答えて

1

あなたのtypedefが間違っています。構文は次のとおりです。だから、

typedef type typealias ; 

匿名構造体あり、ここでエイリアスさ種類は、構造体タグのみが自己参照の構造体のために必要とされること

typedef struct 
{ 
    int item; 
    int count; 
} MapItem; 

typedef struct 
{ 
    MapItem item; 
    int x; 
    int y; 
    int tile; 
    Direction dir; 
    int drop; 
} MapTile; 

注意。

1

typedefは、別のタイプのエイリアスを作成するために使用されます(既存のもの、または同じtypedefステートメントで定義されています)。

その一般的な形式は次のとおりです。

typedef existing_or_new_type alias; 

あなたtypedefでエイリアスタイプはtypedef文で定義された新しいstruct MapItemですが、別名が欠落しています。これがエラーの原因です。

あなたは使用することができます。

typedef struct MapItem { 
    int item; 
    int count; 
} MapItem; 

この文は、新しいタイプstruct MapItemstructキーワードはタイプ名の一部である)とstruct MapItemの別名である新しいタイプMapItemを宣言します。つまり、どこでもstruct MapItemを使用することができますか、代わりにMapItemを使用することができます。

これが混乱していると思われる場合は、structタイプとその別名に異なる名前を使用できます。それとも、まったくstruct定義から名前を省略することができます。

typedef struct { 
    int item; 
    int count; 
} MapItem; 

この方法で、MapItemは、匿名structタイプの名前であり、それは、このタイプの変数を宣言するための唯一の方法です。