代码之家  ›  专栏  ›  技术社区  ›  Wang

在检查大量返回值时使用良好的c风格

  •  11
  • Wang  · 技术社区  · 15 年前

    有时我必须编写代码,在执行操作和检查错误条件之间交替进行(例如,调用库函数,检查其返回值,继续)。这通常会导致长时间运行,实际工作是在if语句的条件下进行的,比如

    if(! (data = (big_struct *) malloc(sizeof(*data)))){
        //report allocation error
    } else if(init_big_struct(data)){
        //handle initialization error
    } else ...
    

    欢迎使用样式指南链接。

    6 回复  |  直到 15 年前
        1
  •  15
  •   Fred Larson    15 年前

    虽然我很难说,但这可能是一个永远不受欢迎的例子 goto http://eli.thegreenplace.net/2009/04/27/using-goto-for-error-handling-in-c/

        2
  •  13
  •   Maurizio Reginelli    15 年前

    我通常这样写代码:

    data = (big_struct *) malloc(sizeof(*data));
    if(!data){
        //report allocation error
        return ...;
    }
    
    err = init_big_struct(data);
    if(err){
        //handle initialization error
        return ...;
    }
    
    ...
    

    通过这种方式,我避免在if中调用函数,调试更容易,因为您可以检查返回值。

        3
  •  3
  •   Community CDub    8 年前

    不要使用 assert
    在调试模式下, 断言 malloc 返回 NULL ),而应该在不可能的情况下使用它(比如数组索引在 C )

    Read this post for more.

        4
  •  2
  •   jamuraa    15 年前

    我用过的一个非常有效的方法是W。理查德·史蒂文斯 Unix Network Programming here . 对于那些他一直希望成功的普通函数,并且对于失败没有追索权,他使用大写字母(代码垂直压缩)来包装它们:

    void * Malloc(size_t size) {
        void    *ptr;
        if ( (ptr = malloc(size)) == NULL)
            err_sys("malloc error");
        return(ptr);
    }
    

    err_sys exit(1) . 这样,您就可以调用Malloc,并知道如果出现问题,它将出错。

    UNP仍然是我所拥有的唯一一本书,我认为作者有检查所有可能失败的函数的返回值的代码。其他每本书都说“你应该检查返回值,但我们会让你稍后再做”。

        5
  •  0
  •   Norman Ramsey    15 年前

    literate programming

        6
  •  0
  •   slartibartfast    15 年前

    这样的代码唯一的分组属性就是它必须遵循一个外部强加的序列。这就是为什么将这些分配放在一个函数中,但这是一个非常弱的通用性。我无法理解为什么有些人建议放弃嵌套if的范围优势。你真的想把口红贴在猪身上(没有侮辱的意思)-代码的性质永远不会产生任何干净的东西,你最好做的是使用编译器帮助捕捉(维护)错误。坚持到底。