使用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。 到目前为止一切都很好。
但是我无法理解结构被声明两次,相同的事实。它们似乎都是匿名的,但后者可以通过“你”获得。
现在问我的问题:
为什么两个结构被定义(冗余?),如果我甚至无法访问它,第一个结构的目的是什么,因为没有绑定到任何类型/变量名。
答案 0 :(得分:21)
Microsoft将匿名结构提供为extension(它们的示例在另一个结构中显示一个结构,但联合中的结构类似)。如果您不介意基于其扩展名的非可移植代码,您可以使用以下内容:
LARGE_INTEGER a;
a.LowPart = 1;
但是如果你想要可移植的代码,你需要:
a.u.LowPart = 1;
联盟允许你使用。
答案 1 :(得分:2)
您可以直接访问LowPart
和HighPart
,而无需通过u
成员。为:
LARGE_INTEGER x;
x.HighPart = 42;
(如果未命名的结构可以是标准C中的联合成员,则需要查找。)