1

2番目の構造体が最初の構造体を配列メンバーとして使用し、それ自体に2つのポインターメンバーがある場合、Cで2つの構造体を定義しようとしています。

Visual Studioは私のコードが好きではありません:

構文エラー:'}'
構文エラー:識別子'tokenListNode'
構文エラー:'*'の前に'{'がありません

これを解決する方法はありますか?

->エラーは、コードの先頭に追加した宣言の有無にかかわらず表示されることに注意してください。

->また、構造体の中括弧の前後の識別子の違いを誰かに説明してもらえれば幸いです。

以下はコードです:

#define ARRAY_SIZE 100

struct tokenListNode;
struct TOKEN_LIST_NODE;


enum TOKEN_TYPE
{
id = 0,
INT_NUM,    
INT_REAL,         
ASSIGNMENT_OP,
RELATION_OP,
ARITHMETIC_OP
} tokenType;

typedef struct TOKEN
{
char* lexema;
enum TOKEN_TYPE type;
int lineNumber;
} token;


typedef struct TOKEN_LIST_NODE
{
token tokenArray[ARRAY_SIZE];
tokenListNode* prevNode;
tokenListNode* nextNode;
int tokenCounter;
}tokenListNode;
4

3 に答える 3

8

tokenListNode使用するまで定義ません。次のように変更します。

typedef struct TOKEN_LIST_NODE tokenListNode;
struct TOKEN_LIST_NODE
{
    token tokenArray[ARRAY_SIZE];
    tokenListNode* prevNode;
    tokenListNode* nextNode;
    int tokenCounter;
};
于 2011-11-28T14:51:52.770 に答える
3

構造体の定義は、キーワードstruct;で構成されます。「構造タグ」; および構造体メンバー

struct tag { int member1; /* &c */ };

タグを省略して名前のない構造体を作成することもできます...なぜそうするのかは別問題です: 構造体タグなしでは構造体を参照することはできません!

struct { int member1; /* &c */ };

また、任意のタイプを使用して別の名前を付けることができますtypedef

typedef old_type new_name;

のように

typedef struct tag { int member1; /* &c */ } tag;
/*      <------------ old type ------------> <new name> */

上記の行は構造体 (という名前struct tag) を定義し、同時にその型に新しい名前を付けます。tag

構造体の中括弧の前後の識別子の違いは何ですか

structこれはとの定義を混合した結果ですtypedef。の前の名前{}は構造体の「タグ」であり、の後の{}名前は型の新しい名前ですtypedef

于 2011-11-28T14:55:16.380 に答える
1

それ自体を参照するときは、typedef されたバージョンの代わりに struct タグを使用する必要があります。

struct TOKEN_LIST_NODE
{
    token tokenArray[ARRAY_SIZE];
    struct TOKEN_LIST_NODE* prevNode;
    struct TOKEN_LIST_NODE* nextNode;
    int tokenCounter;
};
于 2011-11-28T14:53:58.690 に答える