C - #include и несколько определений типов

Я пишу встроенную программу C в eclipse с gcc и не вижу, как обойти определенную проблему. У меня есть typedef в заголовочном файле, который защищен защитой включения. Поскольку я использую этот typedef в нескольких заголовках, мне нужно включить его в другие заголовки, однако, когда я пытаюсь скомпилировать, независимо от того, что я делаю, один из заголовков не видит typedef и жалуется на неизвестное имя типа.

Я считаю, что это иллюстрирует проблему:

заголовок а.ч:

#ifndef _a_h
#define _a_h

typedef enum {
  USBD_OK   = 0,
  USBD_BUSY,
  USBD_FAIL,
}USBD_Status;

#endif

заголовок б.ч:

#ifndef _b_h
#define _b_h

#include "a.h"

extern USBD_Status USB_getStatus(void);

#endif

заголовок с.ч:

#ifndef _c_h
#define _c_h

#include "a.h"

extern USBD_Status USBD_Sync(void);

#endif

Кажется, что это всегда приводит к ошибке «неизвестное имя типа« USBD_Status »», поскольку любой заголовок, скомпилированный вторым, не может видеть typedef. Удаление защиты включения из a.h приводит к жалобе на повторное объявление USBD_Status.

редактировать: я дважды проверил все пути включения, все включения, все имена файлов и все включения защиты - нет дубликатов или опечаток.


person user1839626    schedule 20.11.2012    source источник
comment
Код правильный, двойная и тройная проверка на опечатки: USDB вместо USBD, случайное использование одних и тех же гардов и т.д.   -  person chill    schedule 20.11.2012
comment
Хорошая работа, используя простой автономный правильный пример. Но в том-то и дело, что это правильно, так что должно работать. У вас либо опечатка, либо вы не включаете b.h и c.h.   -  person durron597    schedule 20.11.2012
comment
На данный момент мне удалось решить проблему. Я переместил typedef в новый заголовочный файл и включил его отдельно. изначально это не решило проблему, пока я не начал возиться с порядком включаемых файлов. Кажется, сейчас компилируется.   -  person user1839626    schedule 21.11.2012


Ответы (1)


Возможно, у вас есть другой заголовок, который использует то же имя защиты заголовка.

Вы можете добавить некоторый код в начало вашего a.h, который делает это:

#ifdef _a_h_
#error this header is already defined
#endif

Таким образом, вы сможете отследить везде, где включен a.h, и увидеть, где могут возникнуть какие-либо странности.

Как указано в комментариях, ваш приведенный выше пример работает, поэтому проблема должна быть где-то еще...

person Goz    schedule 20.11.2012
comment
Это не проблема. Я попытался изменить имя защиты заголовка и выполнить поиск дубликатов во всех файлах, и все в порядке. Теперь я закомментировал раздел кода, который вызывает эту ошибку, и я получаю аналогичные проблемы в других частях кода (это библиотеки ST, а не мой код). Единственный другой вариант, о котором я могу думать, - это проблема оптимизации компилятора, когда компилятор не думает, что typedef где-либо используется, и поэтому не сохраняет его. - person user1839626; 21.11.2012
comment
@ user1839626: Я готов поспорить, что это не проблема компилятора. Настоящие ошибки компилятора ОЧЕНЬ редки. - person Goz; 21.11.2012