Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中相互使用的两种类型+;_C++_Types_Header_Destructor_Header Files - Fatal编程技术网

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

C++ 在C+中相互使用的两种类型+;,c++,types,header,destructor,header-files,C++,Types,Header,Destructor,Header Files,在头文件中,我有一个函数指针和一个结构: typedef struct _CONTINUE_STATE { DWORD CurrentCycle; CommandProc* CommandFunc; void* Resered; } CONTINUE_STATE, *PCONTINUE_STATE; -- 问题是CommandProc和CONTINUE_状态都相互使用。函数使用结构作为参数,结构使用函数作为成员。这会导致问题,因为无论哪种类型位于标头顶部,都无法找到它使

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

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

问题是CommandProc和CONTINUE_状态都相互使用。函数使用结构作为参数,结构使用函数作为成员。这会导致问题,因为无论哪种类型位于标头顶部,都无法找到它使用的类型

提前谢谢


编辑:我知道我可以在结构中使用void*作为func类型,然后稍后再将其强制转换,但我想知道是否有更好的方法。

向前声明
结构

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

正向声明
结构

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

非常简单,您只需向前声明
\u CONTINUE\u STATE
(顺便说一句,这是一个可怕的、可能尚未定义的类型名称),然后仍然在typedef中使用它。你不需要在C++中这样的TyBueFF结构。

< P>很简单,你只需提前声明In EnguleStys(一种可怕的,可能是未定义的名字,顺便说一下),仍然在TyPulf中使用它。您不需要在C++中使用类似的结构。

您必须使用预声明。

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;

你必须使用预先声明

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;
首先:

typedef struct _CONTINUE_STATE {
    DWORD CurrentCycle;
    CommandProc* CommandFunc;
    void* Resered;
} CONTINUE_STATE, *PCONTINUE_STATE;
不需要typedef,也不应该使用typedef指针。让我们这样做:

struct _CONTINUE_STATE {
    DWORD CurrentCycle;
    CommandProc* CommandFunc;
    void* Resered;
};
接下来,保留以下划线A和大写字母开头的名称,因此:

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;
};
首先:

typedef struct _CONTINUE_STATE {
    DWORD CurrentCycle;
    CommandProc* CommandFunc;
    void* Resered;
} CONTINUE_STATE, *PCONTINUE_STATE;
不需要typedef,也不应该使用typedef指针。让我们这样做:

struct _CONTINUE_STATE {
    DWORD CurrentCycle;
    CommandProc* CommandFunc;
    void* Resered;
};
接下来,保留以下划线A和大写字母开头的名称,因此:

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

我们真的需要一个常见问题解答。我们真的需要一个常见问题解答。