我的C ++代码中有switch
语句,并希望在该语句的case
内声明和使用变量。该变量仅在特定case
范围内使用。
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;
}
我尝试在int someInt
内部简单地声明,初始化和使用变量(case
),但这给了我一些编译错误......在SO上遇到了这个问题:{{ 3}},我尝试按照建议做出的建议,并将{}
添加到相关的case
,因此我的switch
现在看起来像这样:
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;
}
但我现在收到编译错误,说明:commonData
xyz
switch
案例中使用的变量abc
)上的“未声明的标识符”。
看过这个 - 似乎这个变量是在switch
的{{1}}个案例中声明的......显然,因为我已将{}
添加到{ {1}},尝试在abc
之外使用它,我现在正试图在声明范围之外使用它。
那么为什么我不能声明/使用abc
的方式与声明/使用someInt
相同,而不需要commonData
{}
它声明了什么?
答案 0 :(得分:8)
{ .. }
创建一个局部范围,因此您的变量声明在另一个范围内不可见。
向具有本地范围的每个case
添加声明,或者,如果要在switch语句之外使用该变量,请在switch
之前声明它。
答案 1 :(得分:4)
switch
语句中不允许某些变量声明的原因是:基于switch
的控制流跳过变量初始化是违法的。< / p>
在你的情况下,我假设commonData
的类型具有简单的初始化(没有构造函数,也没有非平凡的成员),因此声明它是完全正常的,就像声明int someInt;
一样。但是,int someInt = 1;
是不允许的,因为只要mode
不是abc
,就会跳过初始化。
除了以掩盖代码为代价保存一些打字之外,我不能完全看到你只宣告commonData
一次所获得的内容(&#34;其中{{1}来自?&#34;当读取commonData
块时),这绝不是一个好的交易。所以我只想在每个case
&#34;块&#34;中使用{}
。并在每个需要它的人中声明case
。或者在交换机上方声明commonData
。
但是,如果确实希望所有commonData
共享commonData
并且case
块本地共享,则可以进行微调范围。像这样:
switch
或者这个:
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;
}
实际上是一个&#34;拼写错误&#34;在你的代码中:从字面上看,它会向前声明一个类型,而不是声明一个变量。但这与你的其余代码中的用法和问题的文本都不相符,所以我冒昧地解决了这个问题。
答案 2 :(得分:-1)
switch语句的二进制代码顺序可能与orignal代码不同,因为编译器会将代码优化为二进制搜索树。因此,不允许交叉范围变量。
答案 3 :(得分:-2)
使用括号。示例:
switch (int number) {
case 3: {
int n = 5;
n = n*4; // random
} break;
case 4: {
int a = 4;
// n is out of scope
} break;
};