Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化者,工会的特定成员_C++_Winapi_Unions - Fatal编程技术网

C++ 初始化者,工会的特定成员

C++ 初始化者,工会的特定成员,c++,winapi,unions,C++,Winapi,Unions,我觉得这个问题的答案是否定的,但是否有可能草签一个工会的特定成员?例如: #include <cassert> #include <Windows.h> int _tmain(int argc, _TCHAR* argv[]) { auto time = 20090520145024798ull; auto large = ULARGE_INTEGER() = { { time } }; asse

我觉得这个问题的答案是否定的,但是否有可能草签一个工会的特定成员?例如:

#include <cassert>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    auto time = 20090520145024798ull;

    auto large = ULARGE_INTEGER() = {           
        { time }
    };

    assert(large.QuadPart == time);

    return 0;
}
ULARGE_INTEGER large{time};
在这种情况下,标准对初始化顺序有何规定?我曾希望编译器能看到QuadPart是分配的合适成员。

保持简单:

ULARGE_INTEGER large;
large.QuadPart = time;
或者,如果你想使用auto并在一行中初始化它,也许可以做一个小助手

inline auto MAKE_ULARGE_INTEGER(ULONGLONG t)
{
    ULARGE_INTEGER result;
    result.QuadPart = t;
    return result;
}

auto large = MAKE_ULARGE_INTEGER(time);
保持简单:

ULARGE_INTEGER large;
large.QuadPart = time;
或者,如果你想使用auto并在一行中初始化它,也许可以做一个小助手

inline auto MAKE_ULARGE_INTEGER(ULONGLONG t)
{
    ULARGE_INTEGER result;
    result.QuadPart = t;
    return result;
}

auto large = MAKE_ULARGE_INTEGER(time);

对于联合,您可以使用列表初始化仅初始化第一个成员,如[dcl.init.aggr]:

当使用大括号内的初始值设定项初始化联合时,大括号只能包含一个初始值设定项子句 用于联合的第一个非静态数据成员。[示例:

-[结束示例]

因此,在您的示例中,以下是:

#include <cassert>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    auto time = 20090520145024798ull;

    auto large = ULARGE_INTEGER() = {           
        { time }
    };

    assert(large.QuadPart == time);

    return 0;
}
ULARGE_INTEGER large{time};
将初始化
u.LowPart
,而不是
QuadPart
,无论各种成员的类型是什么

如果您还想做其他事情,您必须明确说明:

ULARGE_INTEGER large;
large.QuadPart = time;

或者编写一个更好的
union
类型,它实际上有一个构造函数

根据[dcl.init.aggr],对于联合,您只能使用列表初始化来初始化第一个成员:

当使用大括号内的初始值设定项初始化联合时,大括号只能包含一个初始值设定项子句 用于联合的第一个非静态数据成员。[示例:

-[结束示例]

因此,在您的示例中,以下是:

#include <cassert>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    auto time = 20090520145024798ull;

    auto large = ULARGE_INTEGER() = {           
        { time }
    };

    assert(large.QuadPart == time);

    return 0;
}
ULARGE_INTEGER large{time};
将初始化
u.LowPart
,而不是
QuadPart
,无论各种成员的类型是什么

如果您还想做其他事情,您必须明确说明:

ULARGE_INTEGER large;
large.QuadPart = time;

或者编写一个更好的
union
类型,它实际上有一个构造函数

这是唯一的办法。或者正如我所说的,制作一个小助手(与我所做的ULARGE_整数的样式相匹配)。你也可以使用自动。每个人和他们的狗似乎都在(ab)使用
auto
。这当然不是应该使用
auto
的情况。当您不知道具体类型时,在编写库代码时,它很有用。当你知道它的类型时,就不应该使用它。代码应该是可读的,即使您没有将其加载到显示具体类型的工具提示的代码编辑器中(例如,文档中的示例代码、发布为HTML或此网页)。你说的是哪种汽车,功能中使用的第一种还是第二种?不管怎样,也许你应该用另一个例子来抱怨。如果您正在使用这段代码,您就知道auto-large=MAKE_-ULARGE_INTEGER(time)的类型很明显是ULARGE_INTEGER,只需读取函数名即可,这一点非常清楚。至于函数中的auto,完全一样。但是为什么要使用
auto
?你知道那种类型。把它说清楚。我不必通过查看实现(或信任函数名)来找出
auto
的含义。与使用特定类型相比,使用
auto
(两种情况)有什么好处?这是唯一的方法。或者正如我所说的,制作一个小助手(与我所做的ULARGE_整数的样式相匹配)。你也可以使用自动。每个人和他们的狗似乎都在(ab)使用
auto
。这当然不是应该使用
auto
的情况。当您不知道具体类型时,在编写库代码时,它很有用。当你知道它的类型时,就不应该使用它。代码应该是可读的,即使您没有将其加载到显示具体类型的工具提示的代码编辑器中(例如,文档中的示例代码、发布为HTML或此网页)。你说的是哪种汽车,功能中使用的第一种还是第二种?不管怎样,也许你应该用另一个例子来抱怨。如果您正在使用这段代码,您就知道auto-large=MAKE_-ULARGE_INTEGER(time)的类型很明显是ULARGE_INTEGER,只需读取函数名即可,这一点非常清楚。至于函数中的auto,完全一样。但是为什么要使用
auto
?你知道那种类型。把它说清楚。我不必通过查看实现(或信任函数名)来找出
auto
的含义。与使用特定类型相比,使用
auto
(两种情况)有什么好处?