这可以被认为是可接受的 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=]'
) 的反斜杠。
我知道 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=]'
) 的反斜杠。