Я, возможно, делаю это неправильно, и это очень вопрос, почему оно работает в одном компиляторе, а не в другом.
У меня есть большое приложение на C, и я стараюсь придерживаться стиля, не включающего файлы заголовков из других файлов заголовков. Вместо этого, используя форвардные объявления; Таким образом, я пытаюсь сделать следующее.
// in A.h
typedef struct A_ A;
typedef struct B_ B;
struct A_ {
double a;
B *b;
};
// in B.h
typedef struct B_ B;
struct B_ {
int c;
};
// in C.h
typedef struct A_ A;
typedef struct B_ B;
void function_do_something(A*, B*);
// in C.c
#include "A.h"
#include "B.h"
#include "C.h"
void function_do_something(A* a, B* b) {
...
}
Эта парадигма компилируется и работает в Ubuntu 11.10 gcc - но она дает ошибки компилятора в OpenSUSE gcc, которые говорят «переопределение typedef».
Я занимался разработкой в Убунуту и поэтому не осознавал, что эта парадигма может быть неверной. Это просто неправильно и gcc Ubuntu слишком хорош?