错误C2361:'default'标签跳过'found'的初始化

时间:2012-04-30 09:14:13

标签: c++ compiler-errors switch-statement

  

可能重复:
  Why can't variables be declared in a switch statement?

我的代码中有一个奇怪的错误:

char choice=Getchar();
switch(choice)
{
case 's':
    cout<<" display tree ";
    thetree->displaytree();
    break;

case 'i':
    cout<<"  enter value to insert "<<endl;
    cin>>value;
    thetree->insert(value);
    break;
case 'f' :
    cout<< "enter value to find ";
    cin>>value;
    int found=thetree->find(value);
    if(found!=-1)
        cout<<" found  =  "<<value<<endl;
        else
            cout<< " not found " <<value <<endl;
        break;
default:
    cout <<" invalid entry "<<endl;;
    }

Visual Studio 2010编译器说:

1>c:\users\daviti\documents\visual studio 2010\projects\2-3-4\2-3-4\2-3-4.cpp(317): error C2361: initialization of 'found' is skipped by 'default' label
1>          c:\users\daviti\documents\visual studio 2010\projects\2-3-4\2-3-4\2-3-4.cpp(308) : see declaration of 'found'

我认为我已正确编写了break和default语句,那么错误在哪里?

3 个答案:

答案 0 :(得分:55)

您需要用范围大括号括起case 'f':

case 'f' :
{  
    cout<< "enter value to find ";
    cin>>value;
    int found=thetree->find(value);
    if(found!=-1)
        cout<<" found  =  "<<value<<endl;
    else
        cout<< " not found " <<value <<endl;
    break;
}

或将found的声明置于switch

之外

答案 1 :(得分:20)

switch的语义是gotocase的语义 介绍一个新的范围。因此found案例中可以访问default: (虽然你实际上并没有访问它)。跳过一个非平凡的 初始化是非法的,因此您的代码变得非法。

考虑到case 'f':的复杂性,可能是最佳解决方案 把它分解成一个单独的函数。没错,你可以放 {...}中的整个案例,创建一个单独的范围,或放弃 初始化,写作:

int found;
found = thetree->find(value);

(我提到这是为了完整性。它是不是我想要的解决方案 电子书籍。)

答案 2 :(得分:7)

您需要在花括号内声明switch的{​​{1}}的内部变量。即。

case