一段关于C++空间分配的代码的疑问

代码如下:
#include"stdafx.h"
class X{
public:
X(){}
~X(){printf("end");}
};
void f(int i)
{
if(i<10)
{
//goto jump1;
}
X x1;
jump1:
switch(i){
case 1:
X x2;
break;
//case 2:
X x3;
break;
}
}
int main()
{
f(1);
return 0;
}
为什么把//goto jump1,//case 2 任意一个去掉注释,程序就会有定义被跳过的问题?比如就算去掉//goto jump1的注释,jump1之后的代码中没有用到x1啊,为什么非要定义
x1呢?
另外,如果去掉//case2注释,那这和
if(i==1)
X x2;
else if(i==2)
X x3
这段代码貌似没啥区别啊,为什么后者可以通过编译呢?
求好心人解释,谢谢。

首先代码中不建议用goto语句,定义Xx1是因为输入大于10的时候使用的,另外建议复习下switch...case..的用法,
switch(i){
case 1:
X x2;
break;
//case 2: // 后面的代码实际上是执行不到的
X x3;
break;
}
相当于 if ( i == 1 ) Xx2;

goto不就是跳转么,一般不用,用多了,跳来跳去,最后你都不知道跑哪里去了。
switch:每个判断后最好加个break,要不你这个switch可能失效,同时定义default的操作,也要加break

goto jump1;放开会导致X x1被跳过,虽然你后面没有用到x1,但是后面却是x1的作用域范围,在x1的作用域范围内却没有x1的定义,所以编译器报错。
case 2:放开则X x2的定义作用域包含了case 2后面的范围,也同样是因为X x2作用域影响的范围中却有可能根本没定义过x2,这都是编译器的检查。
你定义的变量作用域影响到了别的范围,可是你的定义却又有可能跳过定义,所以编译器就给你个错误报告

感谢各位的回答,谢谢各位了!