Форвард объявить структуру в C - PullRequest
1 голос
/ 02 мая 2020

Быстрый вопрос, как мне переслать объявить следующую treeNodeListCell структуру.

Я пытался написать struct treeNodeListCell до структурирования, и код все еще не компилируется.

У всех есть идея?

struct treeNodeListCell;

typedef struct _treeNode {
    treeNodeListCell *next_possible_positions;
} treeNode;

typedef struct _treeNodeListCell {
    treeNode *node;
    struct _treeNodeListCell *next;
} treeNodeListCell;

PS

Это мой первый вопрос по stackoverflow, поэтому, пожалуйста, скажите, что я могу улучшить при написании вопросов.

Заранее спасибо:)

Ответы [ 3 ]

2 голосов
/ 02 мая 2020

Вы можете форвард объявить struct, но когда вы это сделаете, вам нужно использовать ключевое слово struct с тегом struct, объявленным форвард.

struct _treeNodeListCell;

typedef struct _treeNode {
    struct _treeNodeListCell *next_possible_positions;
} treeNode;

typedef struct _treeNodeListCell {
    treeNode *node;
    struct _treeNodeListCell *next;
} treeNodeListCell;

Альтернатива объявлена ​​заранее typedef. C позволяет вам typedef неполный тип, то есть вы можете typedef структуру до определения структуры. Это позволяет вам использовать typedef в определении структуры.

typedef struct _treeNodeListCell treeNodeListCell;

typedef struct _treeNode {
    treeNodeListCell *next_possible_positions;
} treeNode;

struct _treeNodeListCell {
    treeNode *node;
    treeNodeListCell *next;
};

Если вы хотите использовать структуры в вопросе, не меняя их, все, что вам нужно, это typedef перед определениями структуры.

typedef struct _treeNodeListCell treeNodeListCell;

typedef struct _treeNode {
    treeNodeListCell *next_possible_positions;
} treeNode;

typedef struct _treeNodeListCell {
    treeNode *node;
    struct _treeNodeListCell *next;
} treeNodeListCell;
0 голосов
/ 02 мая 2020

Быстрый вопрос, как мне переслать объявить следующую treeNodeListCell структуру.

Вам не нужно.

Вы должны в первую очередь различать между идентификацией типа структуры по тегу и идентификацией по псевдониму typedef. И, в частности, вы должны понимать, что typedef является полностью необязательным . Там, где вы используете его для определения псевдонимов для структурных типов, может быть более понятно отделить объявление typedef от объявления структуры.

Вот ваши объявления без typedef:

struct _treeNode {
    struct _treeNodeListCell *next_possible_positions;
};

struct _treeNodeListCell {
    struct _treeNode *node;
    struct _treeNodeListCell *next;
};

Для структурных типов, выраженных в форме struct <tag>, не требуется предварительных объявлений.

Вы также можете добавить typedefs. Их можно связать с приведенными выше определениями, добавив ключевое слово typedef и один или несколько идентификаторов, или они могут просто быть написаны отдельно, как я ранее рекомендовал:

typedef struct _treeNode treeNode;
typedef struct _treeNodeListCell treeNodeListCell;

Лично я считаю, что typedefs очень злоупотребляют. Обычно я не определяю псевдонимы typedef для своей структуры и типов объединения.

НО , если вы действительно хотите это сделать, вы можете объявить определение типа неполного типа, например, как -это неопределенный тип структуры. Это обычная декларация, а не предварительная декларация, но она позволит вам использовать псевдонимы в определениях структур, которые я считаю вашей целью:

typedef struct _treeNode treeNode;
typedef struct _treeNodeListCell treeNodeListCell;

struct _treeNode {
    treeNodeListCell *next_possible_positions;
};

struct _treeNodeListCell {
    treeNode *node;
    treeNodeListCell *next;
};

Фактически, начиная с in C11, вы можете написать несколько объявлений одного и того же typedef имени в одной и той же области видимости, если они все определяют имя для идентификации одного и того же типа. Это положение можно использовать для компиляции объявлений typedef / структуры, представленных в вопросе. Обратите внимание, что для обозначения одного и того же типа тип не должен быть выраженным одинаковым образом. Поскольку это должно быть упражнением, я предоставлю вам возможность проработать несколько оставшихся деталей.

0 голосов
/ 02 мая 2020

Вы не можете опустить struct в C.

Вы должны использовать

struct treeNodeListCell *next_possible_positions;

вместо

treeNodeListCell *next_possible_positions;
...