在结构体中创建另一个结构体

4

我正在处理一个老的C语言Windows驱动程序项目,该项目是在Visual C++ 6.0中创建的,现在需要导入到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; mydevice->hfile = handle;
这种结构在vs2012中是否可行?
(编辑-虽然这些显示为错误,但是Visual Studio 2012确实编译并成功构建了解决方案。我将很快测试驱动程序以查看是否一切正常。)
错误信息: struct declaration error message member error message 我认为可以使用以下方法解决问题:创建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 = handle;

这个语句等价吗?


3
您可以在USB_DEVICE中给USB_HANDLE命名来解决此问题。 - Code-Apprentice
我们不应该询问错误信息的内容,因为它应该在你的第一句话中就有体现:“我在VS2012中遇到了以下错误信息:...”。请告诉我们这个关键信息。 - autistic
2个回答

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++不支持此选项。但也许更熟悉这些产品的人可以提供帮助。

1
你可能也想在问题上留下一条评论。我不建议在新代码中这样做,但它可能让你绕过问题,至少能够使用新工具使系统运行起来。 - artless noise

0

看起来 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接