这可以被认为是可接受的 goto 使用吗?

Could this be considered acceptable use of goto?

我知道 goto 很少有地方有用,例如嵌入 for 循环或清理多个函数出口点。我想知道这是否是一个可以接受的地方。

我正在构建一个正则表达式引擎并使用 switch 语句来处理输入的每个单独字符。任何不是元字符的内容都会转到开关的 default.

当我读到反斜杠 (\) 时,我希望下一个字符被转义并按原义处理,即直接跳转到开关的 default 大小写。所以我认为可以通过添加另一个标签将 goto 设置为默认大小写吗?或者我应该按照常规的方式将它分离成一个函数?

for(const char* c = regex; *c; c++){
    if(*c == '\' && *++c)
        goto literal;
    switch(*c){
        case '|':
            ...
        case '*':
            ...
            ...
        default: literal:
            ...
    }
}

它至少是半合法的,但您可以很容易地编写基本相同的代码而无需 goto

for (const char* c = regex; *c; c++)
{
    switch (*c)
    {
    case '|':
        ...
    case '*':
        ...
        ...
    case '\':
        if (*++c == '[=10=]')
            …report backslash followed by null, probably an error…
        /*FALLTHROUGH*/
    default:
        ...
    }
}

请注意,无论如何您都需要在原始 switch 中使用 case 来处理后跟 EOS ('[=14=]') 的反斜杠。