关于c ++:为什么我不能在switch case block中初始化变量

Why I can't initialize a variable in switch case block

本问题已经有最佳答案,请猛点这里访问。

我正在编写一些win32程序,遇到了一个小问题,为什么不能初始化switch case块中的变量。

就像这样:enter image description here

当我这样做的时候,一切都会好起来的。

现在我想知道为什么。


switch()中的case语句与goto具有相同的语义:当发送到switchcase中的标签时,实际上是gotocase标签。这是因为在一个switchcase中的案例不是独立的。你可能会从一个箱子掉到另一个箱子。

事实上,switch--case--goto--goto--case--goto--goto--goto--case--case--goto--goto--EDOCX1(0好好研究,直到你被吓到为止。

在C++中,本地定义的对象在其定义点进入范围,并且在封闭范围的关闭卷曲括号中脱离范围。退出该作用域的breakcontinue语句保证干净地处理超出作用域的对象。

对于您的switch语句,封闭范围由switch()后面的大括号定义。

现在,在C++中,使用EDCOX1×2或类似的东西跳过对象初始化是非法的。在您的示例中,casedefault标签违反了该规则。

修复程序通过用对象分配替换对象初始化来避免这个问题。这是解决问题的一种方法。另一种方法是添加一个额外的范围级别:

1
2
3
4
5
    case WM_LBUTTONDOWN:
    {
        HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));
        break;
    }

这是因为大括号提供了一个额外的范围级别,明确定义了hBrush的生命周期何时结束。

在技术细节方面:触发错误的语句依赖于复制构造函数。不依赖复制分配运算符的语句。


Retired Ninja: You can, you just need to enclose the block in {}

user3116182: yeah,I know that way

< /块引用>

@用户3116182:那你为什么要为此烦恼呢??

如果没有范围声明的变量,通过case块会遇到麻烦,使其消除歧义,或者跳过变量初始化。就这些。