c ++在switch语句中声明变量

时间:2015-05-07 15:22:40

标签: c++ scope switch-statement variable-declaration

我的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 {}它声明了什么?

4 个答案:

答案 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;
};