Избегать предупреждений о переопределении typedef при определении структур - PullRequest
1 голос
/ 13 марта 2012

Я определяю некоторые структуры, которые ссылаются друг на друга, и печатаю определения структур перед их использованием, поэтому каждая структура «осведомлена» о других (получала ошибки компиляции без этого). Не уверен, если это необходимо, или исправить.

Теперь при компиляции с помощью gcc я получаю предупреждения о переопределении typedef. Как правильно это сделать?

typedef struct a A;
typedef struct b B;
typedef struct c C;

struct a {
    B* list;
    A* parent;
};

struct b {
    A* current;
    B* next;
};

struct c {
    A* current;
    A* root;
};

UPDATE: Тупое, неправильное копирование привело к тому, что этот заголовок был дважды включен в другой файл. Я новичок в C и подумал, что это как-то связано с наличием структур в файле дважды. Спасибо @Kevin Ballard за хедз-ап.

Ответы [ 2 ]

5 голосов
/ 13 марта 2012

Это хороший пример того, зачем нужны заголовочные / включенные охранники:

#ifndef MY_HEADER_FILE
#define MY_HEADER_FILE

typedef struct a A;
typedef struct b B;
/* ... */

#endif
0 голосов
/ 13 марта 2012

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

struct b;
struct c;

typedef struct a {
    struct b* list;
    struct a* parent;
} A;

typedef struct b {
    A* current;
    struct b* next;
} B;

typedef struct c {
    A* current;
    A* root;
} C;

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

...