V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liberize
V2EX  ›  C

goto or 异常 or 函数?

  •  
  •   liberize · 2014-07-29 18:17:27 +08:00 · 1177 次点击
    这是一个创建于 3800 天前的主题,其中的信息可能已经有所发展或是发生改变。
    假设有一个函数,

    void foo ()
    {
    // complex conditions
    if (...) {
    ...

    if (...) {
    ...
    goto next;
    }

    if (...) {
    ...
    goto next;
    }

    ...
    }
    else if (...) {
    ...

    if (...) {
    ...
    goto next;
    }
    ...
    }
    else {
    ...
    }

    next:
    // print log, clean and return
    ...
    }

    需要判断很多复杂的情况,最后都要执行最后的 print log, clean and return 部分,请问使用以下哪种方式比较合适?

    1. 继续使用 goto
    2. 使用异常
    3. 将 print log, clean and return 部分写成一个函数
    12 条回复    2014-07-30 11:49:30 +08:00
    cloveryume
        1
    cloveryume  
       2014-07-29 18:22:40 +08:00   ❤️ 1
    可以试试do{} while(0), goto 换成break。
    liberize
        2
    liberize  
    OP
       2014-07-29 18:30:06 +08:00
    @cloveryume 不错,也是个好方法,但如果只在这三种里面选呢?
    Mutoo
        3
    Mutoo  
       2014-07-29 18:32:49 +08:00   ❤️ 1
    @liberize 如果支持异常:就用异常,不支持:用 do-while(0)
    sivacohan
        4
    sivacohan  
       2014-07-29 20:12:57 +08:00 via Android   ❤️ 1
    如果只向下跳跃。goto也是可以接受的。
    baoyexi
        5
    baoyexi  
       2014-07-29 20:19:44 +08:00   ❤️ 1
    看的懂就好。方便维护代码的人理解为优先。
    vixvix
        6
    vixvix  
       2014-07-30 00:09:33 +08:00   ❤️ 1
    throwing exception的开销蛮大的,所以goto还是有意义的。
    Ricepig
        7
    Ricepig  
       2014-07-30 01:04:04 +08:00   ❤️ 1
    性能选goto

    或许可以考虑使用函数指针实现伪函数式编程
    gateswong
        8
    gateswong  
       2014-07-30 04:30:19 +08:00   ❤️ 1
    以前写命令行主循环时经常会这样写:

    int main() {
    init();
    int op;

    goto input;
    while(op != EXIT) {
    // Do things
    input:
    input_value(op);
    }

    }

    跳过第一个循环的前半部份,直接输入数据
    这样如果有很多输入的内容的话可以省下来好几行代码
    c742435
        9
    c742435  
       2014-07-30 08:39:37 +08:00   ❤️ 1
    我个人偏向于goto和函数。这里使用goto意义足够清晰,所以使用goto尚可接受。个人不喜欢在正常情况下使用异常。

    另外如果可能的话,拆分函数以及整理思路使用较为清晰的if嵌套可能更符合我的风格。
    bombless
        10
    bombless  
       2014-07-30 08:56:05 +08:00   ❤️ 1
    异常是什么情况?
    如果异常的话是上层代码处理了,问题是上层代码知道怎么处理么…
    要么意思是把函数体用一个try-catch代替么。那就脱离异常的本意了…
    我倾向于如果可以用raii处理资源回收就用raii,这样比较C++。
    用一个函数来收尾的话这个函数的参数会不会很多?感觉不太现实。
    williamx
        11
    williamx  
       2014-07-30 11:40:19 +08:00
    不推荐用 do while(0)和异常,前者从定义了语法,后者让事情(调试)变得复杂。

    考虑代码的可读性,可以直接用函数,但是如果函数 foo 合适的话,最好的处理方法是返回一个错误,然后在外面判断 foo 的返回值再调用清理函数进行清理————如果反复用到很多次,可以再多封装一个函数。
    dong3580
        12
    dong3580  
       2014-07-30 11:49:30 +08:00
    不要用多了goto,这样多了让别人很难看懂的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3149 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:50 · PVG 20:50 · LAX 04:50 · JFK 07:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.