为什么我无法在开关盒区块中初始化一个变量

这个问题在这里已经有了答案:

  • 为什么不能在switch语句中声明变量? 23个答案

  • case在语句switch()具有相同的语义goto :当你派遣一个标签switch - case ,您可以有效地gotocase标签。 原因是switch案件中的case不是独立的。 你可以从一个案件到另一个案件。

    事实上, switch case goto ,你甚至可以写一个怪物,比如Duff's Device。 研究,直到你被吓坏了。

    在C ++中,本地定义的对象在它们的定义点处进入作用域,并在封闭范围的结束大括号之外超出范围。 保证退出该范围的breakcontinue语句可以清楚地处理超出范围的对象。

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

    现在,在C ++中,使用goto或类似的东西来跳过对象初始化是非法的。 在您的示例中, casedefault标签与该规则相违背。

    您的修补程序通过用对象分配替换对象初始化来避免此问题。 这是修复它的一种方法。 另一个是增加一个额外的范围:

        case WM_LBUTTONDOWN:
        {
            HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));
            break;
        }
    

    这很有效,因为大括号提供了一个额外的范围,清楚地定义hBrush的生命周期何时结束。

    在技​​术细节方面:触发错误的语句依赖于复制构造函数。 该声明不依赖于复制分配操作符。


    退休忍者:你可以,你只需要把块放在{}

    user3116182:是的,我知道那种方式

    @ user3116182:为什么你打扰它?

    如果没有作用域声明的变量,则通过大小写块落入的麻烦将消除歧义,或跳过变量初始化。 就是这样。

    链接地址: http://www.djcxy.com/p/14787.html

    上一篇: Why I can't initialize a variable in switch case block

    下一篇: Why do my switch cases sometime need braces in Objective