c ++在switch语句中声明一个变量
c++ Declaring a variable inside a switch statement
我的 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;
}
我尝试在 case
中简单地声明、初始化和使用变量 (int someInt
),但这给了我一些编译错误......在 SO 上遇到了这个问题: Why can't variables be declared in a switch statement?,我尝试按照建议的答案进行操作,并将 {}
添加到有问题的 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;
}
但我现在收到编译错误:"undeclared identifier" 在 switch
的 xyz
情况下使用的变量 (commonData
)。
查看了这个 - 似乎这个变量是在 switch
的 abc
案例中声明的......很明显,因为我已经添加了 {}
到 abc
,通过尝试在 abc
之外使用它,我现在尝试在其声明范围之外使用它。
那么为什么我不能像声明/使用 commonData
一样声明/使用 someInt
而无需 {}
在 case
声明在哪里?
使用括号。示例:
switch (int number) {
case 3: {
int n = 5;
n = n*4; // random
} break;
case 4: {
int a = 4;
// n is out of scope
} break;
};
{ .. }
创建局部范围,因此您的变量声明在另一个范围内不可见。
为每个具有局部范围的 case
添加声明,或者,如果要在 switch 语句之外使用变量,请在 switch
之前声明它。
switch 语句的二进制代码顺序可能与原始代码不同,因为编译器会将代码优化为二叉搜索树。因此不允许跨范围变量。
在switch
语句中不允许一些变量声明的原因是:基于switch
的控制流跳过是非法的变量初始化。
在你的情况下,我假设 commonData
的类型具有简单的初始化(没有构造函数,也没有非平凡的成员),所以声明它完全没问题,就像只声明 int someInt;
.但是,int someInt = 1;
是不允许的,因为只要 mode
不是 abc
.
,初始化就会被跳过
我不太明白你只声明一次 commonData
会得到什么,除了以模糊代码为代价节省一些输入("where did commonData
come from?" 当阅读 case
块),这从来都不是一个好的交易。所以我只会在每个 case
"block" 中使用 {}
并在需要它的每个中声明 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;
}
但是,请为下一个维护者着想,不要玩这种把戏。
上面的答案假定 struct commonData;
实际上是代码中的 "typo":从字面上看,它会前向声明一个类型,而不是声明一个变量。但这既不符合您其余代码中的用法,也不符合您问题的文本,所以我冒昧地修复了这个问题。
我的 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;
}
我尝试在 case
中简单地声明、初始化和使用变量 (int someInt
),但这给了我一些编译错误......在 SO 上遇到了这个问题: Why can't variables be declared in a switch statement?,我尝试按照建议的答案进行操作,并将 {}
添加到有问题的 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;
}
但我现在收到编译错误:"undeclared identifier" 在 switch
的 xyz
情况下使用的变量 (commonData
)。
查看了这个 - 似乎这个变量是在 switch
的 abc
案例中声明的......很明显,因为我已经添加了 {}
到 abc
,通过尝试在 abc
之外使用它,我现在尝试在其声明范围之外使用它。
那么为什么我不能像声明/使用 commonData
一样声明/使用 someInt
而无需 {}
在 case
声明在哪里?
使用括号。示例:
switch (int number) {
case 3: {
int n = 5;
n = n*4; // random
} break;
case 4: {
int a = 4;
// n is out of scope
} break;
};
{ .. }
创建局部范围,因此您的变量声明在另一个范围内不可见。
为每个具有局部范围的 case
添加声明,或者,如果要在 switch 语句之外使用变量,请在 switch
之前声明它。
switch 语句的二进制代码顺序可能与原始代码不同,因为编译器会将代码优化为二叉搜索树。因此不允许跨范围变量。
在switch
语句中不允许一些变量声明的原因是:基于switch
的控制流跳过是非法的变量初始化。
在你的情况下,我假设 commonData
的类型具有简单的初始化(没有构造函数,也没有非平凡的成员),所以声明它完全没问题,就像只声明 int someInt;
.但是,int someInt = 1;
是不允许的,因为只要 mode
不是 abc
.
我不太明白你只声明一次 commonData
会得到什么,除了以模糊代码为代价节省一些输入("where did commonData
come from?" 当阅读 case
块),这从来都不是一个好的交易。所以我只会在每个 case
"block" 中使用 {}
并在需要它的每个中声明 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;
}
但是,请为下一个维护者着想,不要玩这种把戏。
上面的答案假定 struct commonData;
实际上是代码中的 "typo":从字面上看,它会前向声明一个类型,而不是声明一个变量。但这既不符合您其余代码中的用法,也不符合您问题的文本,所以我冒昧地修复了这个问题。