当第二个结构使用第一个结构作为数组成员并且有两个指针成员时,我试图在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;
答案 0 :(得分:8)
在之后使用它之前,您不会定义tokenListNode
。更改为以下内容:
typedef struct TOKEN_LIST_NODE tokenListNode;
struct TOKEN_LIST_NODE
{
token tokenArray[ARRAY_SIZE];
tokenListNode* prevNode;
tokenListNode* nextNode;
int tokenCounter;
};
答案 1 :(得分: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的花括号
之前和之后的标识符有什么区别
这是混合struct
和typedef
定义的结果。 {}
之前的名称是结构的“标记”,{}
之后的名称是typedef
'd类型的新名称。
答案 2 :(得分:1)
在引用自身时,你需要使用struct标签而不是它的typedef'ed版本。
struct TOKEN_LIST_NODE
{
token tokenArray[ARRAY_SIZE];
struct TOKEN_LIST_NODE* prevNode;
struct TOKEN_LIST_NODE* nextNode;
int tokenCounter;
};