无法理解LARGE_INTEGER结构 [英] cant make sense of LARGE_INTEGER struct

查看:524
本文介绍了无法理解LARGE_INTEGER结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我问这主要是出于好奇心。我不是一个真正的C(++)编码器,但为了拓宽我的地平线,我试图潜水在其他领域,现在,然后。当使用C ++和一些Winapi的东西做这件事时,我遇到了这个家伙:

I'm asking this mainly out of curiousity. I am not really a C(++) Coder but to widen my horizon I try to dive in other areas every now and then. When doing this with C++ and some Winapi things, I encountered this guy:

#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是否设置,这是一个非常

So, the way I see it, depending on MIDL_PASS being set or not, this is either a very compact struct with only a LONGLONG in it, or the much more interesting case, this becomes a union.

如果这是一个联合,对我来说还是有意义的,有两个可能的访问,一次在一个块中的LONGLONG,并且一次结构与低和Highpart。
到目前为止很好。

In case this is a union, it still makes sense to me, to have two possibilites of access, once the LONGLONG in one chunk, and once the struct with Low and Highpart. So far so good.

但是我不能意识到结构被声明两次,相同。看来他们都是匿名的,但后者可以通过u。

But I cannot make any sense out of the fact that the struct is declared twice, identically. It seems they are both anonymous, but the latter one is available via "u".

现在到我的问题:

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

Why are the two structs defined (redundantly?), what is the purpose of the first one, if i cannot even access it, due to not being bound to any type / variable name.

期待您的回答:)

问候,

汤姆

推荐答案

Microsoft提供匿名结构作为 extension (它们的示例显示了另一个结构体中的一个结构体,但是结合体中的结构体类似)。如果你不介意基于他们的扩展的非可移植代码,你可以使用像:

Microsoft provides anonymous structs as an extension (their example shows one struct inside another struct, but a struct in a union is similar). If you don't mind non-portable code based on their extension, you can use things like:

LARGE_INTEGER a;
a.LowPart = 1;

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

but if you want portable code, you need:

a.u.LowPart = 1;

联盟允许您使用。

这篇关于无法理解LARGE_INTEGER结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆