2011-06-06 102 views
0

利用彼此以我的头文件我有一个函数指针和一个结构:两种类型的在C++

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作为参数,并且该结构使用该函数作为成员。这会导致问题,因为无论哪种类型位于标题顶部都无法找到它使用的类型。

在此先感谢。

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

+1

我们确实需要FAQ。 – 2011-06-06 17:58:23

回答

1

首先:

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

无需类型定义的,你不应该的typedef指针。所以让我们作出这样的:

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

下,名称以underscorea和大写字母begining被保留,所以:

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

而且,如果你真的需要相互引用的类型名称,这ISN”牛逼从您的代码明显,是不是很普遍需要的,那么:

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

正向声明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; 
}; 
0

相当简单,你可以向前(对于一个类型一个可怕的,可能未定义的名字,顺便说一句)宣布_CONTINUE_STATE且仍在typedef的使用它。而且你不需要在C++中输入类似的结构。

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;