Switch中定义类变量出现编译错误

Scorpiour 2011-04-23 08:46:40
代码、

switch(cOpt)
{
case 'R':;
case 'r':bEndProg=ReadData();break;
case 'D':;
case 'd':bEndProg=DisplayData();break;
case 'A':;
case 'a':bEndProg=AddData();break;
case 'S':;
case 's':bEndProg=SearchData();break;
case 'Q':;
case 'q':bEndProg=true;break;
case 'Z':;
case 'z':CHESS NewChess;system("color 1F");break;
default:bMenuSwitch=true;goto InFuncMenuLabel1;break;
}
}



之前在Switch中并没有case 'z'这一项,程序也没有问题。

今天想给程序加个小游戏进去,于是调用了作为游戏入口的Class CHESS,结果出现错误。

编译器提示

error C2361: initialization of 'NewChess' is skipped by 'default' label

但是NewChess的初始化不是应该在创建的时候就自动完成的么?为什么还会被default语句跳过?
...全文
128 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiuchengw 2011-04-26
  • 打赏
  • 举报
回复
mark 之前遇到这问题,都是跑到switch外面去定义...汗!
学习
你妹的特盗不 2011-04-26
  • 打赏
  • 举报
回复
ls 的都说了
用户 昵称 2011-04-26
  • 打赏
  • 举报
回复
加{}之后,就可以定时变量了。
Scorpiour 2011-04-26
  • 打赏
  • 举报
回复
大概能明白了。

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

谢谢各位的指教~
Scorpiour 2011-04-26
  • 打赏
  • 举报
回复
我能够理解一部分了。

但是还是不太明白为什么加上{}就可以了呢?是因为{}确定了变量被声明的起始点和摧毁的结束点嘛?
hztj2005 2011-04-24
  • 打赏
  • 举报
回复
switch的分支,在汇编中就是跳转命令goto,编译时必须有相对地址,运行加载时成为绝对地址。
这都在代码区。
CHESS NewChess作为临时变量、对象,运行时临时分配在栈区,如果让你来做一个编译器,你编译时能确定应该跳转到哪里吗? 编译器无法处理,编译器忽略这种变量、对象也同样不妥吧。给你一个错误提示是合理的吧?

error C2361: initialization of 'NewChess' is skipped by 'default' label
这就是说,initialization of 'NewChess' 无法执行初始化。

Scorpiour 2011-04-23
  • 打赏
  • 举报
回复
还是没明白:

switch当遇到匹配项目之后不是按顺序执行么?既然后面有break说明既然执行case 'z' 那么default就不会被执行。

这和局部变量分配在栈区还是堆区有什么关系呢?

还是说,如果没有{}的话,编译器不知道该在什么地方执行析构函数?
hztj2005 2011-04-23
  • 打赏
  • 举报
回复
局部变量分配在栈区stack,switch如何跳转?
Scorpiour 2011-04-23
  • 打赏
  • 举报
回复
了解,可是为什么要加这个括号呢?是什么意义?
kenshu 2011-04-23
  • 打赏
  • 举报
回复
case 'z':{CHESS NewChess;system("color 1F");break;}

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧