本帖最后由 Scorpiour 于 2011-04-23 20:47:28 编辑

解决方案 »

  1.   

    case 'z':{CHESS NewChess;system("color 1F");break;}
      

  2.   

    局部变量分配在栈区stack,switch如何跳转?
      

  3.   

    还是没明白:switch当遇到匹配项目之后不是按顺序执行么?既然后面有break说明既然执行case 'z' 那么default就不会被执行。这和局部变量分配在栈区还是堆区有什么关系呢?还是说,如果没有{}的话,编译器不知道该在什么地方执行析构函数?
      

  4.   

      switch的分支,在汇编中就是跳转命令goto,编译时必须有相对地址,运行加载时成为绝对地址。
      这都在代码区。
      CHESS NewChess作为临时变量、对象,运行时临时分配在栈区,如果让你来做一个编译器,你编译时能确定应该跳转到哪里吗? 编译器无法处理,编译器忽略这种变量、对象也同样不妥吧。给你一个错误提示是合理的吧?   error C2361: initialization of 'NewChess' is skipped by 'default' label
      这就是说,initialization of 'NewChess' 无法执行初始化。
      

  5.   

     之前遇到这问题,都是跑到switch外面去定义...汗!
    学习
      

  6.   

    有关C/C++编译器中对switch中定义变量的分析
      

  7.   

    大概能明白了。没有{}的情况下,整个switch结构中是按照顺序结构而非分支结构执行的(这点在没有break中断的时候就能体现出来),而case语句其实就是一个指向栈区地址的goto语句。因此,直接定义并初始化的局部对象会使得编译器产生“困惑”……谢谢各位的指教~