菜鸟笔记
提升您的技术认知

switch/case语句中,每个case都要加花括号

  • 问题描述: 
    平常写代码过程中常会遇到在switch-case中定义局部变量(如下面的示例中的“case ECOLOR_RED 代码1中定义的temp变量”),但是编译总是无法通过。之前看到书中提到过这个问题,但是好久没写C++,就忘了具体怎么回事,这次用到总算弄明白了。为了以后万一遗忘了方便查阅,特地记录说明。
    switch(color)
    {
    case ECOLOR_RED:
         int temp = 10;  //1: case中定义局部变量 ERROR;
         ……
         do something;
         ……
         break;
    case ECOLOR_GREEN:
        {
            int temp = 20;  //2: case中定义局部变量 RIGHT;
            ……
            do something;
            ……
        }
        break;
    case ECOLOR_BLUE:
        cout << "temp = " << temp << endl;  //3: 使用前面定义的变量, ERROR
        ……
        break;
    default:
        ……
        break;
    }   
  • 解决方案: 
    具体解决办法就像上面代码示例中的“case ECOLOR_GREEN”的做法,在case中加上“{ }”,将局部变量定义在代码块中,便能解决问题;

  • 原因:

    • 由于 switch中包含的整个代码属于同一个代码块,而不是每个case表示一个代码块。
    • 由此带来的问题就是:如果按照上面代码段中第1种情况定义的变量temp,那么同一个代码块中“case ECOLOR_BLUE”内部也就可以引用该变量(如上面代码3所示),而如果switch传进来的标记值“color == ECOLOR_BLUE”,就会导致在代码3处引用未定义的变量“temp”。VC10编译器比较友好,就会给出提示:“error C2360: “b”的初始化操作由“case”标签跳过”,提示指的就是此处所述的情况。
    • 所以上面代码1、3都是错误的,正确使用方式应该按照代码2的做法,把需要用到“temp”变量的代码用大括号括起来,构成代码块,超出该代码块后,该变量失效;