ошибка C2061 при создании структур для связанных списков в c - PullRequest
1 голос
/ 09 апреля 2020

продолжаю получать эту ошибку, даже при том, что я пытался поменять местами структуры, чтобы они были объявлены в правильном месте ... кажется, правильный порядок в этом смысле, но все еще получаю эту ошибку. в чем проблема?

typedef struct YListNode {
    int Yval;
    YListNode *next;
}YListNode;

typedef struct YList {
    YListNode *head;
    YListNode *tail;
}YList;

typedef struct XListNode {
    XListNode * prev;
    int Xval;
    YList yList;
    XListNode *next;
}XListNode;

typedef struct List {
    XListNode *head;
    XListNode *tail;
}List;

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Порядок определения struct не является проблемой, скорее он связан с использованием пока еще неопределенного typedef для определения struct члена ...

В этом объявлении:

typedef struct YListNode {
    int Yval;
    YListNode *next;
}YListNode;

Один и тот же символ (YListNode) используется для struct name (или struct tag) и typedef для struct. Это проблема по двум причинам:

  • Первая - двусмысленность. Сохранение кода в будущем потребует дополнительного внимания со стороны кодировщиков, чтобы правильно применять этот многократно определенный символ.

  • Второй, касающийся вашего конкретного c вопроса, заключается в том, что до struct typedef (YListNode) определено, его не следует использовать в определении любого члена этого struct.

Эта конфигурация в компиляторе CLANG приводит к этой ошибке: 9, 5 error: must use 'struct' tag to refer to type 'YListNode'

Для решения проблемы:
Любой выберите различные символы для этих struct компонентов. Например:

typedef struct yNode {
    int Yval;
    struct yNode *next;
}YListNode;

И применить то же самое к другим объявлениям.

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

typedef struct YListNode YListNode;
typedef struct YList YList;
typedef struct XListNode XListNode;
typedef struct List List;
1 голос
/ 09 апреля 2020

Вы можете использовать предварительное объявление, чтобы сначала объявить typedef struct, а затем определить их.

Вот оно:

    /* forward declaration */
    typedef struct YListNode YListNode;
    typedef struct YList YList;
    typedef struct XListNode XListNode;
    typedef struct List List;

    typedef struct YListNode {
        int Yval;
        YListNode *next;
    }YListNode;

    typedef struct YList {
        YListNode *head;
        YListNode *tail;
    }YList;

    typedef struct XListNode {
        XListNode * prev;
        int Xval;
        YList yList;
        XListNode *next;
    }XListNode;

    typedef struct List {
        XListNode *head;
        XListNode *tail;
    }List;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...