使用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的结构。
到现在为止还挺好。

但是我完全不知道该结构被两次声明的事实。似乎它们都是匿名的,但后者可以通过“u”获得。

现在我的问题是:

为什么要定义这两个结构(冗余?),第一个结构的目的是什么,如果由于没有绑定(bind)到任何类型/变量名而无法访问它的话。

最佳答案

Microsoft提供了一个匿名结构作为extension(他们的示例显示了另一个结构内部的一个结构,但联合中的结构类似)。如果您不介意基于它们的扩展名的非便携式代码,则可以使用以下方法:

LARGE_INTEGER a;
a.LowPart = 1;

但是,如果您需要可移植的代码,则需要:
a.u.LowPart = 1;

联合允许您使用其中之一。

09-05 06:11