взаимоисключающие инклуды, parad, 22-Ноя-07, 14:23 [смотреть все]Сталкнулся с проблемой, для меня новой и очень геморной. Поясню на примере 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" Как разрешить эту ситуацию - совершенно не хочется переписывать много кода и/или плодить файлы для каждой структуры?
|
- взаимоисключающие инклуды, nobody, 16:02 , 22-Ноя-07 (1)
Попробуй не вкладывать в сами заголовочные файлы инклуды на друг друга, делай это только в prog.c
- взаимоисключающие инклуды, angra, 17:51 , 22-Ноя-07 (2)
Научитесь использовать copy/paste. То что вы запостили компилируется без ошибок. А вот то, что у вас на самом деле - нет. Скорее всего потому что B_t это не b_t и не B_H. - взаимоисключающие инклуды, ym, 17:39 , 23-Ноя-07 (3)
Чтобы _не_ компилилось, надо поменять местами строки: >#include "a.h" >#include "b.h" Собственно, вот вам и вариант ответа, что можно сделать. Но лучше из b.h убрать ненужный инклуд. Почему так происходит, разобраться очень просто, если внимательно посмотреть, на эти файлы.
- взаимоисключающие инклуды, parad, 22:10 , 23-Ноя-07 (4)
Этот инклуд очень даже нужный - один модуль конфигурирует другой, для этого во втором есть конфигурационная структура первого. У первого же в хедарсах описываются функции с параметром структуры второго модуля. Тобишь:------------------ 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). А то что первый пример работает - сам удивился, но тестувую схему кода я стер (откуда была взята ошибка) - сравнить не могу.
- взаимоисключающие инклуды, nobody, 21:47 , 25-Ноя-07 (5)
>[оверквотинг удален] >--------------------- >Только отличие этого и выше примеров от жизни в том, что есть >3 таких файла с взаимопересекающимимся структурами. >В принципе я эту проблему решил - но сам не понял как >- чисто на автомате. как будет время разберу, ибо как бы >это была бы не фишка, а баг (gcc). > >А то что первый пример работает - сам удивился, но тестувую схему >кода я стер (откуда была взята ошибка) - сравнить не могу. >Это не настолько принципиально, пожалуйста не забывайте, что в Си работает препроцессор и перед компиляцией собирается всё в один файл. Очень советую посмотреть как работает опция -E у gcc.
|