【问题标题】:LARGE_INTEGER and DUMMYSTRUCTNAMELARGE_INTEGER 和 DUMMYSTRUCTNAME
【发布时间】:2018-10-10 03:26:51
【问题描述】:

当我遇到 LARGE_INTEGER 的定义时。我发现了一些问题:

typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
    LONGLONG QuadPart;
} LARGE_INTEGER;

我们可以改写如下:

typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    LONGLONG QuadPart;
} LARGE_INTEGER;

我认为 struct u 是重复的。那么为什么 MSVC 像这样实现 LARGE_INTEGER 呢?我想知道也许是兼容性之类的原因。

【问题讨论】:

  • 最佳猜测LARGE_INTEGER 一直存在于 Windows SDK 中。他们可能需要u 部分,以便在一个非常旧的编译器版本上编译为“C”代码,该版本预计在当时是命名类型。

标签: c++


【解决方案1】:

这显然是为了避免在联合中使用匿名结构而进行的调整。这已被 Visual C++ 支持,但语言标准不允许。 (有关不带DUMMYSTRUCTNAME 的结构声明,请参阅can't make sense of LARGE_INTEGER struct。)添加名称是为了使联合符合标准C++,可能使用某种自动化工具。

Later versions of LARGE_INTEGER 完全摆脱结构,只使用QuadPart

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多