URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6965
[ Назад ]

Исходное сообщение
"взаимоисключающие инклуды"

Отправлено 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 , 22-Ноя-07 16:02 

Попробуй не вкладывать в сами заголовочные файлы инклуды на друг друга, делай это только в prog.c

"взаимоисключающие инклуды"
Отправлено angra , 22-Ноя-07 17:51 
Научитесь использовать copy/paste. То что вы запостили компилируется без ошибок. А вот то, что у вас на самом деле - нет. Скорее всего потому что B_t это не b_t и не B_H.


"взаимоисключающие инклуды"
Отправлено ym , 23-Ноя-07 17:39 
Чтобы _не_ компилилось, надо поменять местами строки:
>#include "a.h"
>#include "b.h"

Собственно, вот вам и вариант ответа, что можно сделать. Но лучше из b.h убрать ненужный инклуд.
Почему так происходит, разобраться очень просто, если внимательно посмотреть, на эти файлы.


"взаимоисключающие инклуды"
Отправлено parad , 23-Ноя-07 22:10 
Этот инклуд очень даже нужный - один модуль конфигурирует другой, для этого во втором есть конфигурационная структура первого. У первого же в хедарсах описываются функции с параметром структуры второго модуля. Тобишь:

------------------ 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 , 25-Ноя-07 21:47 
>[оверквотинг удален]
>---------------------
>Только отличие этого и выше примеров от жизни в том, что есть
>3 таких файла с взаимопересекающимимся структурами.
>В принципе я эту проблему решил - но сам не понял как
>- чисто на автомате. как будет время разберу, ибо как бы
>это была бы не фишка, а баг (gcc).
>
>А то что первый пример работает - сам удивился, но тестувую схему
>кода я стер (откуда была взята ошибка) - сравнить не могу.
>

Это не настолько принципиально, пожалуйста не забывайте, что в Си работает препроцессор и перед компиляцией собирается всё в один файл. Очень советую посмотреть как работает опция -E у gcc.