Возможно, я делаю это неправильно, и возникает вопрос, почему это работает в одном компиляторе, а не в другом.
У меня есть большое приложение 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».
Я занимался разработкой в Ubunutu и поэтому не осознавал, что эта парадигма может быть неверной. Просто это неправильно, и gcc в Ubuntu слишком хорош?