The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
взаимоисключающие инклуды, !*! 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.




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

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