在结构中创建结构

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;

【讨论】:

以上是关于在结构中创建结构的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Team Foundation Server 2018 中创建层次结构?

我必须在 C 中创建一个带有指向数组的结构数组

在结构中创建变量并访问同一结构中的变量

如何在 NoSQL 环境中创建以下数据结构

无法在Ntier结构中创建EF数据库

如何在 Angular 的自定义结构中创建具有自定义结构的 JSON 数据