Взаимно включенные файлы заголовков вообще плохая идея в C ++.Поскольку механизм включения реализуется путем текстового включения, вы обнаружите, что порядок определения в результирующем файле будет зависеть от того, какой из двух файлов будет включен первым.Поскольку в вашем случае оба они зависят от символа, экспортируемого другим, всегда будут некоторые символы (введите в вашем случае), которые не будут видны в момент использования.
В вашем случае, я 'Рекомендую перенести ваше перечисление в другой файл.Итак, получите файл state.h
:
#ifndef STATE_H_INCLUDED
#define STATE_H_INCLUDED
enum state {
ST_UNINITIALIZED = 0x01,
ST_INITIALIZED = 0x02,
ST_OPENED = 0x03,
ST_UNBLOCKED = 0x04,
ST_DISPOSED = 0x05
};
#endif /* STATE_H_INCLUDED*/
, а затем измените statemachine.h
на:
#ifndef STATEMACHINE_H_INCLUDED
#define STATEMACHINE_H_INCLUDED
#include "port.h"
#include "state.h"
void state_machine(event evt, port_t *port);
#endif /* STATEMACHINE_H_INCLUDED */
и port.h
на:
#ifndef PORT_H_INCLUDED
#define PORT_H_INCLUDED
#include <stdio.h>
#include "state.h"
typedef struct port_tag port_t;
struct port_tag {
state current_state; /* Error 'state does not name a type */
.
.
};
#endif /* PORT_H_INCLUDED */
Сейчас, файл не включен взаимно, порядок разумно определен, и все должно работать правильно.