我正在写一些Win32程序,我遇到一个小问题,为什么我不能在switch case block中初始化一个Variable。
就像它一样:
当我这样做时,它会没问题。
现在我想知道原因。
答案 0 :(得分:3)
case
中的switch()
语句与goto
具有相同的语义:当您发送到switch
- case
中的标签时,您会有效goto
case
标签switch
。原因是case
- switch
中的案例不是自包含的。你可以从一个案件到另一个案件。
事实上,case
- goto
是如此break
- 就像你甚至可以写出像Duff's Device这样的怪物。研究直到你被吓坏了。
在C ++中,本地定义的对象在它们的定义点进入范围,并且在封闭范围的结束大括号中超出范围。退出该范围的continue
或switch
语句可以保证干净地处理超出范围的对象。
对于switch()
语句,封闭范围由goto
后的大括号定义。
现在,在C ++中,使用case
或类似的东西跳过对象初始化是违法的。在您的示例中,default
和 case WM_LBUTTONDOWN:
{
HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));
break;
}
标签违反了该规则。
您的修复通过将对象初始化替换为对象分配来避免此问题。这是修复它的一种方法。另一个是增加额外的范围:
hBrush
这是有效的,因为花括号提供了额外的范围,清楚地定义了{{1}}的生命周期结束的时间。
在技术细节方面:触发错误的语句依赖于复制构造函数。该语句不依赖于副本分配运算符。
答案 1 :(得分:2)
退役忍者:你可以,你只需要将这个区块包含在{}
中user3116182:是的,我知道那样
@ user3116182:为什么你会烦恼呢?
如果没有作用域声明的变量,那么通过大小写块进行操作会遇到麻烦以消除它们的歧义,或者跳过变量初始化。这就是它的全部内容。