在struct内创建struct [英] creating struct within struct
问题描述
我正在导入一个旧的C Windows驱动程序项目,在Visual c + + 6.0中创建到visual studio 2012中。结构的定义方式导致错误在vs2012。
typedef struct {
LINK Link;
HANDLE hFile;
BYTE handleType;
OVERLAPPED重叠;
CRITICAL_SECTION csIoCtrl;
} USB_HANDLE,* PUSB_HANDLE;
typedef struct {
USB_HANDLE; //错误发生在这里说没有声明为USB_HANDLE
LIST PipeList;
BOOL bRemoved;
CRITICAL_SECTION csPipeList;
SP_DEVICE_INTERFACE_DETAIL_DATA * InterfaceData;
} USB_DEVICE; * PUSB_DEVICE;
然后,项目使用调用
USB_DEVICE mydevice;这个类型的结构可能在vs2012?
mydevice-> hfile = handle;
< (编辑 - 虽然这些显示为错误,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_HANDLE
,然后在两者中使用它。喜欢,
#define HANDLE_BODY \
LINK链接; \
HANDLE hFile; \
BYTE handleType; \
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;
如果您也可以创建联合
需要。否则,您可能需要一些特殊的非标准编译器选项。例如,许多编译器支持 transparent_union
,这也会解决你的问题。但是,我不认为Visual C ++支持这一点。但也许有些人更了解这些产品可以帮助。
I'm working on importing an old C windows driver project that was created in Visual c++ 6.0 into visual studio 2012. The way that the structs were defined are causing errors in 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;
The project then uses calls like USB_DEVICE mydevice; mydevice->hfile = handle;
Is this type of structure possible in vs2012?
(edit - though these do show as errors, visual studio 2012 did compile and successfully build a solution. I will be testing the driver to see if everything works properly soon.)
Errors:
A work around that I thought I could use was making the USB_DEVICE struct:
typedef struct {
USB_HANDLE USB_HANDLE;
LIST PipeList;
BOOL bRemoved;
CRITICAL_SECTION csPipeList;
SP_DEVICE_INTERFACE_DETAIL_DATA *InterfaceData;
} USB_DEVICE, *PUSB_DEVICE;
Then I could make the rest of the calls: mydevice->USB_HANDLE.hfile = handle;
Is this an equivalent statement?
Define a macro to declare the USB_HANDLE
and then use it in both. Like,
#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;
You can create a union
if you also need that. Otherwise, you may need some special non-standard compiler options. For instance, many compiler support transparent_union
, which would also solve your issue. However, I don't think Visual C++ supports this. But maybe someone more knowledgeable of these products can help.
这篇关于在struct内创建struct的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!