1

当第二个结构使用第一个作为数组成员并且自身有两个指针成员时,我试图在 C 中定义两个结构。

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'd 类型的新名字。

于 2011-11-28T14:55:16.380 回答
1

引用自身时,您需要使用 struct 标签而不是 typedef 的版本。

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 回答