C switch语句中的最后一个子句(可能使用goto)

时间:2011-08-04 09:02:32

标签: c switch-statement goto

我可以在C开关中使用类似javas finally子句的东西。我的大多数情况都有一组共享的功能,我想把它放在一个案例中。我正在考虑使用goto语句实现这一点,非常了解gotos代码混淆能力,将共享案例置于switch语句的底部仍然似乎是一种“更清晰”的方式,而不是将共享功能划分为单独的函数。

无论如何,我一直试图这样做:

switch( x ) {
case 0:
    printf("Case 0\n");
    goto case 2;
    break;
case 1:
    printf("Case 1\n");
    goto case 2;
    break;
case 2:
    printf("Case 2\n");
    break;
default:
    // do nothing
    break;
}

但是,使用gcc时,会失败并显示错误

error: expected identifier or ‘*’ before ‘case’

有关如何使其工作的任何建议?或者可能是更好的方法?

5 个答案:

答案 0 :(得分:4)

“最佳实践”当然是将共享代码委托给一个函数。但在某些情况下,这是过度工程,或者根本不可能/不可取,那么你可以这样做:

switch( x ) 
{
case 0:
    printf("Case 0\n");
    goto shared_material;

case 1:
    printf("Case 1\n");
    goto shared_material; // Unnecessary, but keep it for clarity.

case 2:
shared_material:
    printf("Case 2\n");
    break;

default:
    // Write a meaningful error message somewhere
    return -1;
}

我发现这太难以辨认了,我没有任何问题,只要整个声明适合一个屏幕(否则它有资格作为 spaghetti代码)。但是,您可能必须在代码审查中对其进行辩护,这是我放弃此类构造并重新考虑代码的主要原因之一。

答案 1 :(得分:2)

为什么不在交换机后放入公共代码

我觉得我必须更新这个回复,用一个我认为有更好设计的答案来解释接受的答案:

switch( x )
{
    case 0:
        printf("Case 0\n");
        break;

    case 1:
        printf("Case 1\n");
        break;

    case 2:
        break;

    default:
        return -1; 
}

printf("Common code for cases 0, 1 and 2\n");

或者,您当然可以在“默认”情况下设置一个标志,以阻止公共代码执行,如果您出于某种原因不希望将其分解为单独的函数。

答案 2 :(得分:1)

您可以使用标记do2,根据需要进行设置,并在切换后进行检查。

如果它与许多层次依赖关系更复杂,那么构建一个具有转换的状态机。

答案 3 :(得分:1)

我宁愿选择这种方法:

void sharedFunction() {
    printf("Case 2\n");
}

switch( x ) {
case 0:
    printf("Case 0\n");
    sharedFunction();
    break;
case 1:
    printf("Case 1\n");
    sharedFunction();
    break;
case 2:
    sharedFunction();
    break;
default:
    // do nothing
    break;
}

答案 4 :(得分:1)

以下作品:

switch( x ) {
case 0:
    printf("Case 0\n");
    if(0)
case 1:{
    printf("Case 1\n");
    }
case 2:
    printf("Case 2\n");
    break;
default:
    // do nothing
    break;
}