在struct内创建struct [英] creating struct within struct

查看:223
本文介绍了在struct内创建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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆