C++交叉初始化错误
C++ cross initiialization error
编译以下代码时,出现了两个错误; "jump to case label" 和 "crosses initialization of std::ofstream SaveLogin"。我目前正在使用带有 gnu gcc 编译器的代码块。
switch(choice) {
case 1:
// login
case 2:
// register
ofstream SaveLogin;
break;
case 3:
// reset password
;}
感谢您查看我的问题 - 编辑:我的问题被标记为与另一个问题重复,但指定的问题并未完全解决我的问题。这个 post 专门针对我的问题,虽然我希望它能希望任何其他遇到同样问题的人
编译器是正确的:C++ 不允许您跳过同一范围内的变量声明。 goto
同样受到限制。
如果您在所有情况下都需要 SaveLogin
,则在 switch
上方声明它。如果你只需要它用于 case 2
然后使用范围块:
case 2 /*not directly relevant but there's no need for the parentheses*/:
{
// register
ofstream SaveLogin; /*ToDo - more logic here unless it's contained
fully within construction and destruction*/
break;
}
case 3:
这里对代码做了一个小改动,应该可以说明问题:
switch(choice) {
case 1:
// login
case 2:
// register
ofstream SaveLogin;
break;
case 3:
// reset password
SaveLogin << "whatever\n"; // added code
;}
最后一行是合法的,因为 SaveLogin
在范围内,但它只会作为 case 3
的一部分执行,它会跳过 SaveLogin
的初始化。所以规则是跳转(switch
或 goto
)不能跳过初始值设定项。正如@Bathsheba 提到的,一种可能性是将 SaveLogin
的定义放在 case 语句之上。另一种可能性是限制 SaveLogin
的范围,以便跳转不会绕过它:
case 2:
{
ofstream SaveLogin;
break;
}
case 3:
有了花括号,SaveLogin
不在 case 3
的范围内,问题就消失了。
编译以下代码时,出现了两个错误; "jump to case label" 和 "crosses initialization of std::ofstream SaveLogin"。我目前正在使用带有 gnu gcc 编译器的代码块。
switch(choice) {
case 1:
// login
case 2:
// register
ofstream SaveLogin;
break;
case 3:
// reset password
;}
感谢您查看我的问题 - 编辑:我的问题被标记为与另一个问题重复,但指定的问题并未完全解决我的问题。这个 post 专门针对我的问题,虽然我希望它能希望任何其他遇到同样问题的人
编译器是正确的:C++ 不允许您跳过同一范围内的变量声明。 goto
同样受到限制。
如果您在所有情况下都需要 SaveLogin
,则在 switch
上方声明它。如果你只需要它用于 case 2
然后使用范围块:
case 2 /*not directly relevant but there's no need for the parentheses*/:
{
// register
ofstream SaveLogin; /*ToDo - more logic here unless it's contained
fully within construction and destruction*/
break;
}
case 3:
这里对代码做了一个小改动,应该可以说明问题:
switch(choice) {
case 1:
// login
case 2:
// register
ofstream SaveLogin;
break;
case 3:
// reset password
SaveLogin << "whatever\n"; // added code
;}
最后一行是合法的,因为 SaveLogin
在范围内,但它只会作为 case 3
的一部分执行,它会跳过 SaveLogin
的初始化。所以规则是跳转(switch
或 goto
)不能跳过初始值设定项。正如@Bathsheba 提到的,一种可能性是将 SaveLogin
的定义放在 case 语句之上。另一种可能性是限制 SaveLogin
的范围,以便跳转不会绕过它:
case 2:
{
ofstream SaveLogin;
break;
}
case 3:
有了花括号,SaveLogin
不在 case 3
的范围内,问题就消失了。