Сталкнулся с проблемой, для меня новой и очень геморной. Поясню на примере 3х файлов:
---------- a.h
#ifndef _A_H_
#define _A_H_
#include "b.h"typedef struct { fromb_t b; } froma_t;
#endif
---------- b.h
#ifndef _B_H_
#define _B_H_
#include "a.h"typedef struct { int i; } fromb_t;
#endif
----------- prog.c
#include "a.h"
#include "b.h"int
main (void) {
return 0;
}
----------------------------------------
В таком варианте не хочет компилиться, выдает что-то наподобии:
In file included from ./b.h:3,
from ./test.c:1:
././a.h:6: error: syntax error before "B_t"Как разрешить эту ситуацию - совершенно не хочется переписывать много кода и/или плодить файлы для каждой структуры?
Попробуй не вкладывать в сами заголовочные файлы инклуды на друг друга, делай это только в prog.c
Научитесь использовать copy/paste. То что вы запостили компилируется без ошибок. А вот то, что у вас на самом деле - нет. Скорее всего потому что B_t это не b_t и не B_H.
Чтобы _не_ компилилось, надо поменять местами строки:
>#include "a.h"
>#include "b.h"Собственно, вот вам и вариант ответа, что можно сделать. Но лучше из b.h убрать ненужный инклуд.
Почему так происходит, разобраться очень просто, если внимательно посмотреть, на эти файлы.
Этот инклуд очень даже нужный - один модуль конфигурирует другой, для этого во втором есть конфигурационная структура первого. У первого же в хедарсах описываются функции с параметром структуры второго модуля. Тобишь:------------------ module1.h
#include <module2.h>
typedef struct {
....
} mod1_conf_t;void *some(mod2_t);
------------------ module2.h
#include <module1.h>
typedef struct {
....
mod1_conf_t *conf;
} mod2_t;---------------------
Только отличие этого и выше примеров от жизни в том, что есть 3 таких файла с взаимопересекающимимся структурами.
В принципе я эту проблему решил - но сам не понял как - чисто на автомате. как будет время разберу, ибо как бы это была бы не фишка, а баг (gcc).А то что первый пример работает - сам удивился, но тестувую схему кода я стер (откуда была взята ошибка) - сравнить не могу.
>[оверквотинг удален]
>---------------------
>Только отличие этого и выше примеров от жизни в том, что есть
>3 таких файла с взаимопересекающимимся структурами.
>В принципе я эту проблему решил - но сам не понял как
>- чисто на автомате. как будет время разберу, ибо как бы
>это была бы не фишка, а баг (gcc).
>
>А то что первый пример работает - сам удивился, но тестувую схему
>кода я стер (откуда была взята ошибка) - сравнить не могу.
>Это не настолько принципиально, пожалуйста не забывайте, что в Си работает препроцессор и перед компиляцией собирается всё в один файл. Очень советую посмотреть как работает опция -E у gcc.