Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我能';t初始化开关盒块中的变量_C++_Winapi - Fatal编程技术网

C++ 为什么我能';t初始化开关盒块中的变量

C++ 为什么我能';t初始化开关盒块中的变量,c++,winapi,C++,Winapi,我正在写一些Win32程序,我遇到了一个小问题,为什么我不能在switch case块中初始化变量 就像这样: 当我这么做的时候,一切都会好起来的 现在我想知道原因。开关()中的case语句与goto具有相同的语义:当您在开关中调度到标签时-case,实际上就是转到case标签。这是因为开关中的案例-案例不是独立的。你可能会从一个案子跌到另一个案子 事实上,switch-case就是这样的goto——你甚至可以编写一个怪物,比如。仔细研究,直到你被吓坏为止 在C++中,局部定义的对象在定义的范围

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

就像这样:

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


现在我想知道原因。

开关()中的
case
语句与
goto
具有相同的语义:当您在
开关中调度到标签时-
case
,实际上就是
转到
case
标签。这是因为
开关中的案例
-
案例
不是独立的。你可能会从一个案子跌到另一个案子

事实上,
switch
-
case
就是这样的
goto
——你甚至可以编写一个怪物,比如。仔细研究,直到你被吓坏为止

在C++中,局部定义的对象在定义的范围内进入范围,并在封闭范围的关闭卷曲括号中脱离范围。退出该范围的
break
continue
语句保证干净地处理超出范围的对象

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

现在,在C++中,使用<代码> Goto 或类似的东西跳过对象初始化是非法的。在您的示例中,

case
default
标签与该规则相冲突

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

    case WM_LBUTTONDOWN:
    {
        HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));
        break;
    }
这是因为大括号提供了一个额外的作用域级别,可以清楚地定义
hBrush
的生命周期何时结束


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

开关()
中的
case
语句与
goto
具有相同的语义:当您在
开关-
case
中调度到标签时,实际上是
转到
case
标签。这是因为
开关中的案例
-
案例
不是独立的。你可能会从一个案子跌到另一个案子

事实上,
switch
-
case
就是这样的
goto
——你甚至可以编写一个怪物,比如。仔细研究,直到你被吓坏为止

在C++中,局部定义的对象在定义的范围内进入范围,并在封闭范围的关闭卷曲括号中脱离范围。退出该范围的
break
continue
语句保证干净地处理超出范围的对象

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

现在,在C++中,使用<代码> Goto 或类似的东西跳过对象初始化是非法的。在您的示例中,

case
default
标签与该规则相冲突

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

    case WM_LBUTTONDOWN:
    {
        HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));
        break;
    }
这是因为大括号提供了一个额外的作用域级别,可以清楚地定义
hBrush
的生命周期何时结束

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


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

用户3116182:是的,我知道那条路

@user3116182:你为什么要为此烦恼

如果没有范围声明的变量,遍历case块将遇到麻烦,无法消除它们的歧义,或者跳过变量初始化。就这些


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

用户3116182:是的,我知道那条路

@user3116182:你为什么要为此烦恼


如果没有范围声明的变量,遍历case块将遇到麻烦,无法消除它们的歧义,或者跳过变量初始化。这就是它的全部内容。

请将代码作为文本发布。你可以,你只需要将块括在
{}
中。是的,我知道那种方式。请将代码作为文本发布。你可以,你只需要将块括在
{}
中。是的,我知道那种方式。