Попытка определить две надежные структуры в C

Я пытаюсь определить две структуры в 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 ответа

Решение

Определение структуры состоит из ключевого слова 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.

Вы не определяете tokenListNode до тех пор, пока вы не используете его. Изменить на следующее:

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

Вы должны использовать тег struct вместо его версии с определением типа при обращении к себе.

struct TOKEN_LIST_NODE
{
    token tokenArray[ARRAY_SIZE];
    struct TOKEN_LIST_NODE* prevNode;
    struct TOKEN_LIST_NODE* nextNode;
    int tokenCounter;
};
Другие вопросы по тегам