2012-03-13 4 views
1

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

Теперь, когда вы компилируете gcc, я получаю предупреждения «redefinition of 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 и думал, что это должно быть связано с тем, что структуры в файле дважды. Спасибо @ Кевин Баллард за головы.

+4

«переопределение ЬурейеГо»? Вы уверены, что не импортируете один и тот же заголовок дважды без защиты заголовков? –

+1

Этот код отлично компилируется. Можете ли вы скопировать и вставить свой код? –

ответ

5

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

#ifndef MY_HEADER_FILE 
#define MY_HEADER_FILE 

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

#endif 
0

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

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 несколько раз.

+0

Исправлено, забыли включить их при копировании кода вручную. – Bort

+0

Я вижу их? Может быть, он его отредактировал. Но я вижу полуколоны. – DanRedux

+0

@Bort: Ну, это компилируется для меня. –

Смежные вопросы