让我说我有:
switch( choice ) {
case A:
stmt;
do_stmt_related2A;
break;
case B:
stmt;
do_stmt_related2B;
break;
case C: something_different();
...
}
Run Code Online (Sandbox Code Playgroud)
我怎么能避免重复stmt代码?
但有任何解决方法吗?gcc扩展标签作为值看起来非常适合这种情况.
switch( choice ) {
do {
case A: ptr = &&A_label;
break;
case B: ptr = &&B_label;
} while(0);
stmt;
goto *ptr;
case C: ...
Run Code Online (Sandbox Code Playgroud)
是否有任何技巧可以在ANSI-C中做同样的事情?编辑:我当然想到了函数/宏/内联.还有别的吗?这也与表现无关.仅用于教育目的.;)
pax*_*blo 29
你为什么不重构stmt
(我假设这是一大块指令而不是单行)到它自己的函数中do_stmt()
并调用它?就像是:
switch( choice ) {
case A:
do_stmt();
do_stmt_related2A;
break;
case B:
do_stmt();
do_stmt_related2B;
break;
case C: something_different();
...
}
Run Code Online (Sandbox Code Playgroud)
那个gcc技巧真的很可怕.我希望任何一天都能在这些怪物身上找到可读的代码.
你应该总是假设继承你代码的程序员是一个杀人的疯子谁知道你住在哪里:-)
sbi*_*sbi 17
我怎么能避免重复stmt代码?
通过将其放入函数并调用它.
而且,不,你不知道这是否会减慢你的应用程序,直到你分析它并发现它是瓶颈.(如果确实如此,请使用宏,或者,如果是C99,则使用宏inline
.)
除了将公共代码重构为子函数的常见情绪之外,使用标准C功能重构代码的最简单方法可能是:
if (choice == A || choice == B) {
stmt;
}
switch( choice ) {
case A:
do_stmt_related2A;
break;
case B:
do_stmt_related2B;
break;
case C:
something_different();
...
}
Run Code Online (Sandbox Code Playgroud)
它干净地表达了您想要做的事情,它避免了切换器内部的开关,阻止某些编译器有效地优化代码.
归档时间: |
|
查看次数: |
898 次 |
最近记录: |