C 功能结构:“;如果出现错误,请提前返回“;或;如果出现错误,则分配,否则,分配,返回分配值“;?

C 功能结构:“;如果出现错误,请提前返回“;或;如果出现错误,则分配,否则,分配,返回分配值“;?,c,if-statement,return,C,If Statement,Return,在嵌入式系统中,给定以下功能结构: 返回变量的条件赋值: int foo(int x) { int status; if (is_valid(x)) { /* long computation with x */ status = /* some result */; } else status = STATUS_ERROR; return status; } 提早返回: int foo(in

在嵌入式系统中,给定以下功能结构:

  • 返回变量的条件赋值:

    int foo(int x)
    {
        int status;
    
        if (is_valid(x))
        {
            /* long computation with x */
            status = /* some result */;
        }
        else
            status = STATUS_ERROR;
    
        return status;
    }
    
  • 提早返回:

    int foo(int x)
    {
        if (!is_valid(x))
            return STATUS_ERROR;
    
        /* long computation with x */
        return /* some result */;
    }
    
  • 我认为后者应优于前者,因为:

    • 对于
      状态
      ,它不需要额外和不必要的定义和分配
    • 它清楚地向读者说明,在出现错误的情况下,除了以语言允许的最清晰的方式返回
      STATUS\u error
      之外,不做任何事情
    • 它允许正常情况下的代码更平坦,因为它不必缩进
      if
      -
      else
    然而,我已经看到前者被用于一些不同的项目中。我相信这可能与开发的调试步骤有关,以便:

    • 具有单返回点,允许更容易地放置断点
    • 通过
      状态检查即将返回的值(尤其是在该单次返回时)
    我认为这样做是为了调试,对吗?是否有其他理由选择1。超过2个。?是1。在纯金属开发的背景下考虑良好实践


    请注意,与中不同的是,如果出现无效的
    x

    错误代码,则在返回错误代码之前不会执行任何操作。如果您询问是否应该使用其中一个,这将是一个基于意见的问题,应该关闭

    但这个问题似乎在问,是否有任何事实让你在两者之间做出决定,或者这只是一个品味的问题,所以对我来说,这似乎是一个有效的问题


    答案很简单,两者之间没有客观区别;这很简单,你觉得哪一个更合适(或者如果你必须遵循一种编码风格)。

    相关:Linux内核编码风格更喜欢第二个示例。但这是一个偏好的问题,比调试与否更重要。通常最好使用第二种方法,即测试某项内容并报告错误,然后可能测试其他内容并报告错误,最后执行主操作并报告成功。当只有一个测试时,最好还是把较小的代码块(错误报告)放在第一位,因为更容易识别程序块。在第一种情况下,您在底部隐藏有关错误情况的信息,距离触发条件的测试数英里。早期回报通常是有益的。