两种类型在C ++中相互使用

时间:2011-06-06 17:57:29

标签: c++ types header destructor header-files

在我的头文件中,我有一个函数指针和一个结构:

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都互相使用。该函数使用struct作为参数,struct使用该函数作为成员。这会导致问题,因为标题顶部的任何类型都无法找到它使用的类型。

提前致谢。

编辑:我知道我可以在结构中使用void *作为func类型然后再投射它,但我想知道是否有更好的方法。

4 个答案:

答案 0 :(得分:2)

转发声明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 :(得分:1)

首先:

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

不需要typedef,也不应该输入defde指针。所以,让我们:

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;
};

答案 2 :(得分:0)

很简单,你可以直接声明_CONTINUE_STATE(顺便说一下,类型的一个可怕的,可能是未定义的名称),并仍然在typedef中使用它。而且你不需要在C ++中输入类似的结构。

答案 3 :(得分:0)

您必须使用预申报。

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;