Попытка определить две надежные структуры в 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;
};