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并没有声明变量,而是一个不完整的类型。我不想在开关外部使用变量,但它似乎需要在开关外部声明,这样它就可以在一个案例中使用。事实并非如此。您可以在交换机中创建局部作用域,并仅向该作用域添加(和使用)变量。但这并不是你在例子中所做的。谢谢你的回答-非常有用的解释。