欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记报错 "error: jump to case label [-fpermissive]" 局部变量的作用域问题

程序员文章站 2022-07-03 20:49:37
...

文章目录

❯ cd "f:\myCPlusPlusCode\DataStructure\Stack\" ; if ($?) { g++ -fexec-charset=GBK bracketMatch.cpp -o bracketMatch.exe } ; if ($?) { .\bracketMatch.exe }
bracketMatch.cpp: In function 'int bracketMatch(std::__cxx11::string)':   
bracketMatch.cpp:41:13: error: jump to case label [-fpermissive]
             default: break;
             ^~~~~~~
bracketMatch.cpp:35:22: note:   crosses initialization of 'char ch'       
                 char ch = S.top();
                      ^~

问题代码如下

switch ( e ) {
    case '{':
    case '[':
    case '(':
        S.push(e);
        break;
    case '}':
    case ']':
    case ')':
        if ( S.empty() ) return RIGHT_UNNECESSARY;
        char ch = S.top();
        if ( ch=='{'&&e=='}' || ch=='['&&e==']' || ch=='('&&e==')' ) {
            S.pop();
        } else {
            return TYPE_ERROR;
        }
    default: break;
}

很明显报错说 跳过了变量ch的初始化, 这是为什么呢?

是因为每个变量都有它的作用域, 从声明开始到 } 结束, 这是一个生命周期,
但是再这个 switch循环里, 比如说在 e==’} 的时候, 声明了一个ch, 又到了 e==’]’ 的时候, 又要声明一个ch, , 由于一个变量的生命周期是到 循环的 } 时才结束, ch变量并没有被销毁, 是存在的, 所以就是这里出的问题

解决办法有两个, 一个是加一对 {} 来限制局部变量的作用域, 再者就是将生命的位置提前到括号前来提升它的优先级

switch ( e ) {
    case '{':
    case '[':
    case '(':
        S.push(e);
        break;
    case '}':
    case ']':
    case ')': { // 加花括号是为了限制 变量ch 的作用域
        if ( S.empty() ) return RIGHT_UNNECESSARY;
        char ch = S.top();
        if ( ch=='{'&&e=='}' || ch=='['&&e==']' || ch=='('&&e==')' ) {
            S.pop();
        } else {
            return TYPE_ERROR;
        }
    }
    default: break;
}