试图在C中定义两个可靠的结构

时间:2011-11-28 14:46:32

标签: c syntax struct cyclic

当第二个结构使用第一个结构作为数组成员并且有两个指针成员时,我试图在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;

3 个答案:

答案 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的花括号

之前和之后的标识符有什么区别

这是混合structtypedef定义的结果。 {}之前的名称是结构的“标记”,{}之后的名称是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;
};