Само-ссылочная структура, определенная в заголовочном файле C, выдает ошибку - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь написать файл заголовка, содержащий макросы для двусвязного списка типа c.

Узлы определены следующим образом:

#define node(T)                \
    struct node_##T            \
    {                          \
        T val;                 \
        struct node_##T *next; \
        struct node_##T *prev; \
    }

Затем я использую node(T) для создания linkedlist(T) struct:

#define linkedlist(T)       \
    struct linkedlist_##T   \
    {                       \
        unsigned int count; \
        node(T) *head;      \
        node(T) *end;       \
    }

Наконец, объявляется linkedlist(Student) ll;, который вызывает node(Student) и выдает эту ошибку при компиляции:

error: redefinition of ‘struct node_Student’

Ошибка возникает в строке, в которой впервые объявлено struct node_##T.

Интересно, что ошибка исчезает, когда я вставляю точку с запятой в конце определения структуры, например:

        . . . .
        struct node_##T *prev; \
    };

Однако это невозможно сделать, так как тогда объявление node(T) N; будет невозможно.

Что может быть возможным исправлением?

1 Ответ

2 голосов
/ 24 января 2020

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

#define linkedlist(T)       \
    struct linkedlist_##T   \
    {                       \
        unsigned int count; \
        struct node_##T *head;     \
        struct node_##T *end;      \
    };

. Вам понадобится отдельная строка node(T) для каждого T до linkedlist(T) где-то.

...