在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,一次是具有Low和Highpart的结构。到目前一切尚好。
但是我无法理解这个结构被声明了两次,而且都是一样的。它们似乎都是匿名的,但后者可以通过"u“获得。
现在来回答我的问题:
为什么定义这两个结构(冗余的?),如果我甚至无法访问第一个结构,由于没有绑定到任何类型/变量名,那么第一个结构的用途是什么?
发布于 2010-08-31 15:42:18
微软提供了匿名结构作为extension (他们的示例显示了一个结构包含在另一个结构中,但联合中的结构类似)。如果您不介意基于其扩展的不可移植代码,您可以使用如下内容:
LARGE_INTEGER a;
a.LowPart = 1;
但是如果你想要可移植的代码,你需要:
a.u.LowPart = 1;
联合允许您使用这两种方法中的任何一种。
发布于 2010-08-31 15:35:36
您可以直接访问LowPart
和HighPart
,而不必通过u
成员。作为:
LARGE_INTEGER x;
x.HighPart = 42;
(如果未命名的结构可以是标准C中的联合成员,则需要查找。)
https://stackoverflow.com/questions/3606902
复制相似问题