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

Joh*_*ohn 0 c goto

我知道有一些地方goto可能有用,例如嵌入式循环或清理多个功能退出点.我想知道这是否是一个可以接受的地方.

我正在构建一个正则表达式引擎,并使用switch语句来处理输入的每个字符.任何不是元字符的东西都会转到交换机上default.

当我读取反斜杠(\)时,我希望下一个字符被转义并处理为文字,即直接跳转到开关的default情况.所以我认为goto通过添加另一个标签只是默认情况可以吗?或者我应该采用传统方式并将其分成一个函数?

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

Jon*_*ler 5

它至少是半合法的,但你可以编写基本相同的代码,而不是goto很容易:

for (const char* c = regex; *c; c++)
{
    switch (*c)
    {
    case '|':
        ...
    case '*':
        ...
        ...
    case '\\':
        if (*++c == '\0')
            …report backslash followed by null, probably an error…
        /*FALLTHROUGH*/
    default:
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,无论如何,您需要case在原始文件switch中处理反斜杠,然后是EOS('\0').