无法理解LARGE_INTEGER结构

Tom*_*Tom 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;
Run Code Online (Sandbox Code Playgroud)

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

如果这是一个联合,我仍然有意义,有两个可能的访问权限,一个LONGLONG在一个块中,一个结构有Low和Highpart.到现在为止还挺好.

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

现在问我的问题:

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

Jer*_*fin 21

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

LARGE_INTEGER a;
a.LowPart = 1;
Run Code Online (Sandbox Code Playgroud)

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

a.u.LowPart = 1;
Run Code Online (Sandbox Code Playgroud)

工会允许你使用任何一个.