posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
void   func(   void   )   
{   
        
int   x;   
        
switch   (   x   )   
        {   
        
case   0   :   
              
int   i   =   1;               //   error,   skipped   by   case   1       
              {   int   j   =   1;   }       //   ok,   initialized   in   enclosing   block   
        case   1   :   
              
int   k   =   1;               //   ok,   initialization   not   skipped   
        }   
}

在VC中使用switch语句时遇到“error C2360: initialization of 'k' is skipped by 'case' label”的编译错误。

msdn有下面的说明:   
compiler   error   c2360   
initialization   of   identifier   is   skipped   by   case   label  
the   specified   identifier   initialization   can   be   skipped   in   a   switch   statement.   
it   is   illegal   to   jump   past   a   declaration   with   an   initializer   unless   the   declaration   is   enclosed   in   a   block.   
the   scope   of   the   initialized   variable   lasts   until   the   end   of   the   switch   statement   unless   it   is   declared   in   an   enclosed   block   within   the   switch   statement.   
the   following   is   an   example   of   this   error: 



在switch语句内定义一个变量的时候,如果不在一个语句块内,它是直到遇到switch的"}"才结束的。int i = 1;错误,错就错在它是以switch的"}"结束的,此时被case 1:语句跳过。int j = 1;它是遇到下面的"}"就结束了,因此正确。int k = 1;它虽然没有在一个语句块中,但它的下一个结束"}"正好就是switch的"}",不会被跳过,因此也正确。

所以,如果有在case内定义新变量,最好将该条case内的语句加上{}构成语句块,避免出错。
总之而言:在case里面声明变量要用{}进行作用域限制。