0

我有以下相当简单的代码:

    WNDCLASSEX windowClass = {0};

    windowClass.cbSize { sizeof(WNDCLASSEX) };

我想知道为什么上面的代码不起作用,下面的代码起作用:

    WNDCLASSEX windowClass = {0};

    windowClass.cbSize = { sizeof(WNDCLASSEX) };

Visual Studio 15 2017 给了我这两个错误:

1:期望一个';'

2: 错误 C2064: 术语不计算为带 1 个参数的函数

4

3 回答 3

3

不能多次初始化同一个变量(windowClass),也不能在单独的初始化语句中初始化成员变量。

在您的情况下,因为 cbSize 是第一项

WNDCLASSEX windowsClass { sizeof(WNDCLASSEX) };

这会将 cbSize 设置为 sizeof(WNDCLASSEX) 并将结构的其余部分设置为 0。

于 2017-07-15T21:52:33.063 回答
0

第一个版本“不起作用”,因为它在语法上毫无意义。C++ 语法中没有能够解析您的第一个变体的分支。编译器根本不知道您要通过该字符序列说什么。所以,这个问题真的是给你的:你试图通过第一个版本实现什么?

第二个版本有效,因为它是有效的 C++ 代码。{ sizeof(WNDCLASSEX) }赋值右侧的 被解释为创建/初始化与 相同类型的临时对象windowClass.cbSize。然后将该临时对象分配给windowClass.cbSize. 即,因为windowClass.cbSizeUINT类型,你的第二个版本被解释为

windowClass.cbSize = UINT{ sizeof(WNDCLASSEX) };

在实践中具有相同的效果

windowClass.cbSize = sizeof(WNDCLASSEX);
于 2017-07-15T23:28:54.827 回答
0

或者为什么不使用完整的 C++?

struct WndClasssEx : WNDCLASSEX
{
    WndClassex() : WNDCLASSEX { sizeof(WNDCLASSEX) } {}

}

auto mywndclass = WndClasssEx();
DoSomethingWindowsy(&mywndclass);

请参阅 c++ 标准,[Class] 部分(此处引用自标准草案 n4527, 2015)。

特别是关于标准布局类型的注释:

[ 注意:标准布局类对于与用其他编程语言编写的代码进行通信很有用。它们的布局在 9.2 中指定。——尾注]

于 2017-07-15T22:47:02.187 回答