从范围跳转

Jumping from a scope

是否可以从未命名的范围跳转?

void MyFunc() {
    {
        ... // Code

        if (!head_size) {
            goto _common_error; // <- break and continue don't work here
        }

        ... // Code

        if (!tail_size) {
            goto _common_error; // second time
        }

        ... // Code
    }

    _common_error:
    {
        ... // Code
    }
}

我的问题不是这是否可以重新设计,而是c++中是否有我不知道的技巧。

除了 goto 之外,c++ 中是否有跳出未命名范围的机制? break 和 continue 在范围内不起作用。

更新 1:将单词命名空间更改为范围

是的,你需要使用goto跳出作用域。

break只能用于跳出循环或切换。

但是您可以通过使用虚拟循环来使用(有问题的)技巧:

void MyFunc() {
    do {
        ... // Code

        if (!head_size) {
            break;
        }

        ... // Code

        if (!tail_size) {
            break;
        }

        ... // Code
    } while (false);

    {
        ... // Error handling code
    }
}

使用宏魔法

#define BREAKABLE_SCOPE() for (char __scope = 0; __scope == 0; __scope++)

然后你可以做

int main()
{
    // Will only print "Hello!"
    BREAKABLE_SCOPE()
    {
        printf("Hello!");
        break;
        printf("Hello again!");
    }
    return 0;
}

请注意,宏会降低代码的可读性。