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" 在 switchxyz 情况下使用的变量 (commonData)。

查看了这个 - 似乎这个变量是在 switchabc 案例中声明的......很明显,因为我已经添加了 {}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":从字面上看,它会前向声明一个类型,而不是声明一个变量。但这既不符合您其余代码中的用法,也不符合您问题的文本,所以我冒昧地修复了这个问题。