C switch 语句中的最终子句(可能使用 goto)

Ken*_*eth 1 c goto switch-statement

我可以在 C 开关中使用类似 javas finally 子句的东西。我的大多数案例都有一组共享的功能,我想将其放在一个案例中。我正在考虑使用 goto 语句来实现这一点,充分了解 goto 代码混淆能力,将共享案例放在 switch 语句的底部似乎仍然是比将共享功能分区到单独函数中更“干净”的方法。

\n\n

不管怎样,我一直在尝试做这样的事情:

\n\n
switch( x ) {\ncase 0:\n    printf("Case 0\\n");\n    goto case 2;\n    break;\ncase 1:\n    printf("Case 1\\n");\n    goto case 2;\n    break;\ncase 2:\n    printf("Case 2\\n");\n    break;\ndefault:\n    // do nothing\n    break;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,使用 gcc 会失败并出现错误

\n\n
error: expected identifier or \xe2\x80\x98*\xe2\x80\x99 before \xe2\x80\x98case\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

关于如何使其发挥作用有什么建议吗?或者可能有更好的方法?

\n

Ale*_* C. 5

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

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;
}
Run Code Online (Sandbox Code Playgroud)

我不觉得这太难读,而且我对此没有任何问题,只要整个语句适合一个屏幕(否则它就相当于意大利面条代码)。但是,您可能必须在代码审查中捍卫它,这是我放弃此类构造并重新思考代码的主要原因之一。