The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"взаимоисключающие инклуды"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"взаимоисключающие инклуды"  
Сообщение от parad on 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"

Как разрешить эту ситуацию - совершенно не хочется переписывать много кода и/или плодить файлы для каждой структуры?

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "взаимоисключающие инклуды"  
Сообщение от nobody (??) on 22-Ноя-07, 16:02 

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "взаимоисключающие инклуды"  
Сообщение от parad on 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).

А то что первый пример работает - сам удивился, но тестувую схему кода я стер (откуда была взята ошибка) - сравнить не могу.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру