使用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;
联合允许您使用其中之一。