$ g++ -std=c++2a temp.cpp temp.cpp:27:8: error: redefinition of 'temp' int temp = j; ^ temp.cpp:22:8: note: previous definition is here int temp = i; ^ temp.cpp:31:3: error: cannot jump from switch statement to this case label default: ^ temp.cpp:22:8: note: jump bypasses variable initialization int temp = i; ^ temp.cpp:26:3: error: cannot jump from switch statement to this case label case 1: ^ temp.cpp:22:8: note: jump bypasses variable initialization int temp = i; ^ 3 errors generated.
报错指向了从 case 1: 开始的下一行( vim 插件报错从 case 1: 开始 主要错误为第一个,重定义了 temp
错误原因
这个错误的原因其实在于 switch case 内变量的生存期
我们知道,C和C++ 都把大括号作为栈内存变量生存期的重要依据 也就是说,普通的局部变量的生存期是在碰到右大括号的时候自动结束的 而 switch case 有一个特点,可以不加大括号 但是,两个其实是有区别的 不加大括号的 switch case 内变量的生存期延伸到 switch 的右大括号结束 而上面的例子中,case 0: 的 int temp 生存期一直覆盖了 case 1 内 这就会导致重定义的问题