我可以在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’
有关如何使其工作的任何建议?或者可能是更好的方法?
答案 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;
}