我有以下相当简单的代码:
WNDCLASSEX windowClass = {0};
windowClass.cbSize { sizeof(WNDCLASSEX) };
我想知道为什么上面的代码不起作用,下面的代码确实如此:
WNDCLASSEX windowClass = {0};
windowClass.cbSize = { sizeof(WNDCLASSEX) };
Visual Studio 15 2017给了我这两个错误:
1:期待&#39 ;;'
2:错误C2064:术语不评估为采用1个参数的函数
答案 0 :(得分:3)
您不能多次初始化同一个变量(windowClass),也不能在单独的初始化语句中初始化成员变量。
在你的情况下,因为cbSize是第一个项目
WNDCLASSEX windowsClass { sizeof(WNDCLASSEX) };
这会将cbSize设置为sizeof(WNDCLASSEX),将结构的其余部分设置为0。
答案 1 :(得分:0)
或者为什么不去完整的c ++?
struct WndClasssEx : WNDCLASSEX
{
WndClassex() : WNDCLASSEX { sizeof(WNDCLASSEX) } {}
}
auto mywndclass = WndClasssEx();
DoSomethingWindowsy(&mywndclass);
参见c ++标准,[Class]部分(引自标准草案n4527,2015)。
特别是有关标准布局类型的说明:
[注意:标准布局类对于与使用其他编程语言编写的代码进行通信非常有用。 它们的布局在9.2中规定。 - 结束说明]
答案 2 :(得分:0)
第一个版本"不起作用"因为它在语法上是荒谬的。 C ++语法中没有能够解析你的第一个变体的分支。编译器根本不知道你想通过该字符序列说什么。那么,问题实在是对你:你试图通过第一个版本实现了什么?
第二个版本有效,因为它是有效的C ++代码。赋值右侧的{ sizeof(WNDCLASSEX) }
被解释为与windowClass.cbSize
相同类型的临时对象的创建/初始化。然后将该临时对象分配给windowClass.cbSize
。即,由于windowClass.cbSize
具有UINT
类型,因此您的第二个版本被解释为
windowClass.cbSize = UINT{ sizeof(WNDCLASSEX) };
实际上与
具有相同的效果windowClass.cbSize = sizeof(WNDCLASSEX);