Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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++;在switch语句中声明变量 我在C++代码中有一个开关>代码>语句,并希望在语句的案例< /代码>中声明和使用变量。该变量将仅在该特定案例的范围内使用 switch(mode) { case abc: ... struct commonData; commonData = manager->getDataByIndex(this->Data.particularData); int someInt = 1; ... break; case xyz: ... commonData = Manager->getDataByIndex(this->Data.particularData); break; default: ... break; }_C++_Scope_Switch Statement_Variable Declaration - Fatal编程技术网

c++;在switch语句中声明变量 我在C++代码中有一个开关>代码>语句,并希望在语句的案例< /代码>中声明和使用变量。该变量将仅在该特定案例的范围内使用 switch(mode) { case abc: ... struct commonData; commonData = manager->getDataByIndex(this->Data.particularData); int someInt = 1; ... break; case xyz: ... commonData = Manager->getDataByIndex(this->Data.particularData); break; default: ... break; }

c++;在switch语句中声明变量 我在C++代码中有一个开关>代码>语句,并希望在语句的案例< /代码>中声明和使用变量。该变量将仅在该特定案例的范围内使用 switch(mode) { case abc: ... struct commonData; commonData = manager->getDataByIndex(this->Data.particularData); int someInt = 1; ... break; case xyz: ... commonData = Manager->getDataByIndex(this->Data.particularData); break; default: ... break; },c++,scope,switch-statement,variable-declaration,C++,Scope,Switch Statement,Variable Declaration,我试着简单地声明、初始化和使用变量(intsomeint),就在案例中,但这给了我一些编译错误。。。在SO:上遇到这个问题后,我尝试按照答案的建议进行操作,并将{}添加到所讨论的案例中,因此我的开关现在看起来如下所示: switch(mode) { case abc: { ... struct commonData; commonData = manager->getDataByIndex(this->Data.particularData);

我试着简单地声明、初始化和使用变量(
intsomeint
),就在
案例中,但这给了我一些编译错误。。。在SO:上遇到这个问题后,我尝试按照答案的建议进行操作,并将
{}
添加到所讨论的
案例中,因此我的
开关现在看起来如下所示:

switch(mode)
{
case abc:
    {
    ...
    struct commonData;
    commonData = manager->getDataByIndex(this->Data.particularData);
    int someInt = 1;
    ...
    break;
    }
case xyz:
    ...
    commonData = manager->getDataByIndex(this->Data.particularData);
    break;
default:
    ...
    break;
}
switch(mode)
{
    SomeType commonData;
case abc:
    {
    ...
    commonData = manager->getDataByIndex(this->Data.particularData);
    int someInt = 1;
    ...
    break;
    }
case xyz:
    ...
    commonData = manager->getDataByIndex(this->Data.particularData);
    break;
default:
    ...
    break;
}
但是我现在得到了编译错误,在
开关的
xyz
案例中使用的变量(
commonData
)上显示“未声明的标识符”

在研究了这一点之后-似乎该变量是在
开关的
abc
案例中声明的。。。所以很明显,由于我已经将
{}
添加到
abc
,通过尝试在
abc
之外使用它,我现在尝试在其声明的范围之外使用它


那么,为什么我不能像
commonData
那样声明/使用
someInt
,而不需要在声明它的
案例中使用
{}
。例如:

switch (int number) {
    case 3: { 
        int n = 5; 
        n = n*4; // random
    } break;

    case 4: {
        int a = 4;
        //  n is out of scope
    } break;
};

{..}
创建一个局部作用域,因此变量声明在另一个作用域中不可见


将声明添加到具有局部作用域的每个
案例
,或者,如果要在switch语句之外使用变量,请在
开关
之前声明它

switch语句的二进制代码顺序可能与原始代码不同,因为编译器会将代码优化为二进制搜索树。因此,不允许跨作用域变量。

switch
语句中不允许某些变量声明的原因是:基于
switch
的控制流跳过变量初始化是非法的

在您的例子中,我假设
commonData
的类型具有简单的初始化(没有构造函数,也没有非简单的成员),因此声明它是完全正确的,就像声明
int-someInt。然而,
intsomeint=1,因为只要
模式
不是
abc
,就会跳过初始化

我不太明白你只声明一次
commonData
会得到什么,除了以模糊代码为代价节省一些输入(“当阅读
案例时,
commonData
来自哪里?”这从来都不是一个好交易。因此,我只需在每个
案例中使用
{}
“块”,并在每个需要它的案例中声明
commonData
。或者在开关上方声明
commonData

但是,如果您确实希望所有
案例
共享相同的
commonData
,并且仍然是
开关
块的本地,则可以微调作用域。大概是这样的:

switch(mode)
{
case abc:
    {
    ...
    struct commonData;
    commonData = manager->getDataByIndex(this->Data.particularData);
    int someInt = 1;
    ...
    break;
    }
case xyz:
    ...
    commonData = manager->getDataByIndex(this->Data.particularData);
    break;
default:
    ...
    break;
}
switch(mode)
{
    SomeType commonData;
case abc:
    {
    ...
    commonData = manager->getDataByIndex(this->Data.particularData);
    int someInt = 1;
    ...
    break;
    }
case xyz:
    ...
    commonData = manager->getDataByIndex(this->Data.particularData);
    break;
default:
    ...
    break;
}
或者这个:

switch(mode)
{
case abc:
    SomeType commonData;
    ...
    commonData = manager->getDataByIndex(this->Data.particularData);
    {
    int someInt = 1;
    ...
    break;
    }
case xyz:
    ...
    commonData = manager->getDataByIndex(this->Data.particularData);
    break;
default:
    ...
    break;
}
但是,请考虑下一个维护人员,不要玩这种把戏



上面的答案假设
struct commonData
实际上是代码中的一个“输入错误”:从字面上说,它将向前声明一个类型,而不是声明一个变量。但这既不符合代码其余部分的用法,也不符合问题的文本,因此我冒昧地解决了这个问题。

struct TypeNameforStruct{//struct members};结构公共数据的类型名称?嗯?您发布的代码有问题或不完整。struct commonData并没有声明变量,而是一个不完整的类型。我不想在开关外部使用变量,但它似乎需要在开关外部声明,这样它就可以在一个案例中使用。事实并非如此。您可以在交换机中创建局部作用域,并仅向该作用域添加(和使用)变量。但这并不是你在例子中所做的。谢谢你的回答-非常有用的解释。