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 的初始化。所以规则是跳转(switchgoto)不能跳过初始值设定项。正如@Bathsheba 提到的,一种可能性是将 SaveLogin 的定义放在 case 语句之上。另一种可能性是限制 SaveLogin 的范围,以便跳转不会绕过它:

case 2:
    {
    ofstream SaveLogin;
    break;
    }
case 3:

有了花括号,SaveLogin 不在 case 3 的范围内,问题就消失了。