无法理解LARGE_INTEGER结构

时间:2010-08-31 07:30:21

标签: c++ winapi data-structures

使用C ++和一些Winapi的东西,我遇到了这个人:

#if defined(MIDL_PASS)
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    };
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;

所以,我看到它的方式,取决于MIDL_PASS的设置与否,这是一个非常紧凑的结构,只有一个LONGLONG,或者更有趣的情况,这就变成了一个联合。

如果这是一个联合,对我来说仍然有意义,有两个访问可能性,一个LONGLONG在一个块中,一个结构有Low和Highpart。 到目前为止一切都很好。

但是我无法理解结构被声明两次,相同的事实。它们似乎都是匿名的,但后者可以通过“你”获得。

现在问我的问题:

为什么两个结构被定义(冗余?),如果我甚至无法访问它,第一个结构的目的是什么,因为没有绑定到任何类型/变量名。

2 个答案:

答案 0 :(得分:21)

Microsoft将匿名结构提供为extension(它们的示例在另一个结构中显示一个结构,但联合中的结构类似)。如果您不介意基于其扩展名的非可移植代码,您可以使用以下内容:

LARGE_INTEGER a;
a.LowPart = 1;

但是如果你想要可移植的代码,你需要:

a.u.LowPart = 1;

联盟允许你使用。

答案 1 :(得分:2)

您可以直接访问LowPartHighPart,而无需通过u成员。为:

LARGE_INTEGER x;
x.HighPart = 42;

(如果未命名的结构可以是标准C中的联合成员,则需要查找。)