Попытка определить две надежные структуры в C - PullRequest
1 голос
/ 28 ноября 2011

Я пытаюсь определить две структуры в C, когда вторая структура использует первую в качестве члена массива и имеет два члена-указателя сама по себе.

Visual Studio не нравится мой код:

синтаксическая ошибка: '}'
синтаксическая ошибка: идентификатор 'tokenListNode'
синтаксическая ошибка: отсутствует '{' before '*'

есть идеи, как решить эту проблему?

-> Обратите внимание, что ошибки появляются с или без объявлений, которые я добавил в начале кода.

-> Кроме того, если кто-то может объяснить мне, что это такоеЯ буду благодарен за разницу между идентификатором до и после фигурных скобок структуры.

Ниже приведен код:

#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 ]

8 голосов
/ 28 ноября 2011

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

typedef struct TOKEN_LIST_NODE tokenListNode;
struct TOKEN_LIST_NODE
{
    token tokenArray[ARRAY_SIZE];
    tokenListNode* prevNode;
    tokenListNode* nextNode;
    int tokenCounter;
};
3 голосов
/ 28 ноября 2011

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

1 голос
/ 28 ноября 2011

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

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