проблема с enum "не называет тип" - PullRequest
5 голосов
/ 18 апреля 2011
g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5

У меня проблема, и я, кажется, узнаю, как я получаю эту ошибку.

файл statemachine.h

#ifndef STATEMACHINE_H_INCLUDED
#define STATEMACHINE_H_INCLUDED

#include "port.h"

enum state {
    ST_UNINITIALIZED = 0x01,
    ST_INITIALIZED   = 0x02,
    ST_OPENED        = 0x03,
    ST_UNBLOCKED     = 0x04,
    ST_DISPOSED      = 0x05
};

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 "statemachine.h"

struct port_t {
    state current_state; /* Error 'state does not name a type */
    .
    .
};
#endif /* PORT_H_INCLUDED */

Большое спасибо за любые предложения,

Ответы [ 4 ]

7 голосов
/ 18 апреля 2011

Может быть, вы включили "statemachine.h" в "port.h" и "port.h" в "statemachine.h"?

Попробуйте удалить строку:

#include "port.h"

Из файла "statemachine.h"

Редактировать (в соответствии с комментарием Даниэля ниже):

Затем вам необходимо переслать объявление вашего типа port_t следующим образом:

...
    ST_DISPOSED       = 0x05
};

struct port_t;

void state_machine(event evt, port_t *port);
...
4 голосов
/ 18 апреля 2011

Вам нужен еще один заголовочный файл, скажем, states.h, который содержит перечисление состояния.Тогда и port.h и statemachine.h должны включать этот заголовок.

например.
states.h

#ifndef STATES_H_INCLUDED
#define STATES_H_INCLUDED

enum state {
    ST_UNINITIALIZED = 0x01,
    ST_INITIALIZED   = 0x02,
    ST_OPENED        = 0x03,
    ST_UNBLOCKED     = 0x04,
    ST_DISPOSED      = 0x05
};

#endif
1 голос
/ 18 апреля 2011

Взаимно включенные файлы заголовков вообще плохая идея в 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 */

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

1 голос
/ 18 апреля 2011

Чтобы разорвать эту циклическую зависимость, выполните одно из следующих двух действий:

  1. не включайте port.h в statemachine.h, и вместо этого объявите forward
  2. move void state_machine(event evt, port_t *port);в port.h

Выберите, что имеет больше смысла.


Чтобы переслать декларацию, сделайте это в statemachine.h:

#ifndef STATEMACHINE_H_INCLUDED
#define STATEMACHINE_H_INCLUDED

struct port_t;

enum state {
    ST_UNINITIALIZED = 0x01,
    ST_INITIALIZED   = 0x02,
    ST_OPENED        = 0x03,
    ST_UNBLOCKED     = 0x04,
    ST_DISPOSED      = 0x05
};

void state_machine(event evt, port_t *port);

#endif /* STATEMACHINE_H_INCLUDED */

вы все ещедолжны включать port.h в statemachine.cpp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...