Два типа используют друг друга в C ++ - PullRequest
0 голосов
/ 06 июня 2011

В моем заголовочном файле у меня есть указатель на функцию и структура:

typedef struct _CONTINUE_STATE {
    DWORD CurrentCycle;
    CommandProc* CommandFunc;
    void* Resered;
} CONTINUE_STATE, *PCONTINUE_STATE;

-

typedef HRESULT (*CommandProc)(SOCKET client, char* command, char* response, CONTINUE_STATE* continueProc);

Проблема в том, что CommandProc и CONTINUE_STATE оба используют друг друга. Функция использует структуру в качестве аргумента, а структура использует функцию в качестве члена. Это вызывает проблемы, потому что какой-либо тип в верхней части заголовка не может найти тип, который он использует.

Заранее спасибо.

Редактировать: Я знаю, что могу использовать void * для типа func в структуре, а затем привести его позже, но мне интересно, есть ли лучший способ.

Ответы [ 4 ]

2 голосов
/ 06 июня 2011

Форвард объявить struct:

struct _CONTINUE_STATE;
typedef struct _CONTINUE_STATE CONTINUE_STATE, *PCONTINUE_STATE;

typedef HRESULT (*CommandProc)(SOCKET client, char* command, char* response,
                               CONTINUE_STATE* continueProc);

struct _CONTINUE_STATE {
    DWORD CurrentCycle;
    CommandProc* CommandFunc;
    void* Resered;
};
1 голос
/ 06 июня 2011

Во-первых:

typedef struct _CONTINUE_STATE {
    DWORD CurrentCycle;
    CommandProc* CommandFunc;
    void* Resered;
} CONTINUE_STATE, *PCONTINUE_STATE;

Нет необходимости в typedefs, и вы не должны указатели typedef. Итак, давайте сделаем это:

struct _CONTINUE_STATE {
    DWORD CurrentCycle;
    CommandProc* CommandFunc;
    void* Resered;
};

Далее, имена, начинающиеся с символа подчеркивания и заглавной буквы, зарезервированы, поэтому:

struct CONTINUE_STATE {
    DWORD CurrentCycle;
    CommandProc* CommandFunc;
    void* Resered;
};

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

struct CONTINUE_STATE {
    DWORD CurrentCycle;
    struct CommandProc * CommandFunc;   // forward declaration
    void* Resered;
};

Наконец, по соглашению имена типов в C ++ находятся в смешанном регистре, причем верхний регистр зарезервирован для констант, поэтому:

struct ContinueState {
    DWORD CurrentCycle;
    struct CommandProc * CommandFunc;   // forward declaration
    void* Resered;
};
0 голосов
/ 06 июня 2011

Вы должны использовать предварительную декларацию.

struct CONTINUE_STATE;
typedef HRESULT (*CommandProc)(SOCKET client, char* command, char* response, CONTINUE_STATE* continueProc);

typedef struct _CONTINUE_STATE {
  DWORD CurrentCycle;
  CommandProc* CommandFunc;
  void* Resered;
} CONTINUE_STATE, *PCONTINUE_STATE;
0 голосов
/ 06 июня 2011

Проще говоря, вы можете просто объявить _CONTINUE_STATE (кстати, ужасное и, возможно, неопределенное имя для типа) и по-прежнему использовать его в typedef.И вам не нужно печатать такие структуры в C ++.

...