避免重复代码

Nya*_*yan 9 c c99

让我说我有:

  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技巧真的很可怕.我希望任何一天都能在这些怪物身上找到可读的代码.

你应该总是假设继承你代码的程序员是一个杀人的疯子谁知道你住在哪里:-)

  • +1爱上这种怪异的语法是一种自我毁灭的绝对方式. (7认同)

sbi*_*sbi 17

我怎么能避免重复stmt代码?

通过将其放入函数并调用它.

而且,不,你知道这是否会减慢你的应用程序,直到你分析它并发现它是瓶颈.(如果确实如此,请使用宏,或者,如果是C99,则使用宏inline.)

  • 当你在前几次投票时,会出现一个提示,要求你在评论中解释你为什么要投票.过了一会儿,该提示不再出现了.但是,你仍然应该解释为什么你投票给了答案.__为什么这会被投票?__ (3认同)
  • 这看起来对我很有用.任何认为不同的人都是白痴或巨魔.+1给出了好的答案,如果我能给你一个同情+2,我愿意. (3认同)
  • 简单的+1 vs -1从不像"-1因为......"那样具有教育意义.通过评论可以更快地鼓励期望的行为. (2认同)

bta*_*bta 9

除了将公共代码重构为子函数的常见情绪之外,使用标准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)

它干净地表达了您想要做的事情,它避免了切换器内部的开关,阻止某些编译器有效地优化代码.