在我的头文件中,我有一个函数指针和一个结构:
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类型然后再投射它,但我想知道是否有更好的方法。
答案 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;