在结构中创建结构
Posted
技术标签:
【中文标题】在结构中创建结构【英文标题】:creating struct within struct 【发布时间】:2013-04-04 00:42:34 【问题描述】:我正在将在 Visual c++ 6.0 中创建的旧 C Windows 驱动程序项目导入 Visual Studio 2012。定义结构的方式导致 vs2012 中的错误。
typedef struct
LINK Link;
HANDLE hFile;
BYTE handleType;
OVERLAPPED Overlapped;
CRITICAL_SECTION csIoCtrl;
USB_HANDLE, *PUSB_HANDLE;
typedef struct
USB_HANDLE; //error occurs here saying nothing was declared for USB_HANDLE
LIST PipeList;
BOOL bRemoved;
CRITICAL_SECTION csPipeList;
SP_DEVICE_INTERFACE_DETAIL_DATA *InterfaceData;
USB_DEVICE, *PUSB_DEVICE;
然后项目使用如下调用 USB_DEVICE 我的设备; mydevice->hfile = 句柄;
这种结构在vs2012中是否可行?
(编辑 - 虽然这些确实显示为错误,但 Visual Studio 2012 确实编译并成功构建了一个解决方案。我将测试驱动程序以查看是否一切正常。)
错误:
我认为可以使用的解决方法是制作 USB_DEVICE 结构:
typedef struct
USB_HANDLE USB_HANDLE;
LIST PipeList;
BOOL bRemoved;
CRITICAL_SECTION csPipeList;
SP_DEVICE_INTERFACE_DETAIL_DATA *InterfaceData;
USB_DEVICE, *PUSB_DEVICE;
然后我可以拨打其余的电话: mydevice->USB_HANDLE.hfile = 句柄;
这是等价的说法吗?
【问题讨论】:
您可以通过为 USB_DEVICE 中的 USB_HANDLE 命名来解决此问题。 我们不应该问错误消息说什么,因为它应该在您的第一句话中:“我在 VS2012 中收到以下错误消息:...”。请告知我们这些重要信息。 【参考方案1】:定义一个宏来声明USB_HANDLE
,然后在两者中都使用它。喜欢,
#define HANDLE_BODY \
LINK Link; \
HANDLE hFile; \
BYTE handleType; \
OVERLAPPED Overlapped; \
CRITICAL_SECTION csIoCtrl;
typedef struct
HANDLE_BODY
USB_HANDLE, *PUSB_HANDLE;
typedef struct
HANDLE_BODY
LIST PipeList;
BOOL bRemoved;
CRITICAL_SECTION csPipeList;
SP_DEVICE_INTERFACE_DETAIL_DATA *InterfaceData;
USB_DEVICE, *PUSB_DEVICE;
如果您还需要,可以创建union
。否则,您可能需要一些特殊的非标准编译器选项。例如,许多编译器支持transparent_union
,这也可以解决您的问题。但是,我认为 Visual C++ 不支持这一点。但也许对这些产品更了解的人可以提供帮助。
【讨论】:
您可能还想对该问题发表评论。我不建议在新代码中使用此方法,但它可以让您解决问题并至少让系统使用新工具运行。【参考方案2】:看来USB_DEVICE中的USB_HANDLE类型没有定义任何变量。
typedef struct
USB_HANDLE handler; // handler is missing?
LIST PipeList;
BOOL bRemoved;
CRITICAL_SECTION csPipeList;
SP_DEVICE_INTERFACE_DETAIL_DATA *InterfaceData;
USB_DEVICE, *PUSB_DEVICE;
【讨论】:
以上是关于在结构中创建结构的主要内容,如果未能解决你的问题,请参考以下文章