C: 返回错误的代码样式



我的所有函数都是这样的:

short Function()
{
   short ret = 0;
   ret = FunctionA();   
   if(ret != 0) return ret;
   ret = FunctionB();
   if(ret != 0) return ret;
   ret = FunctionC();
   if(ret != 0) return ret;
   return 0;
}

有更好的写法吗?无需重复

if(ret != 0) return ret;

一直?

如果不能像其他答案中建议的那样使用短路||,则可以为此定义一个宏:

#define TRY(var, x) if ((var = (x))) return var

然后在你的代码中:

short Function()
{
  short ret;
  TRY(ret, FunctionA());
  TRY(ret, FunctionB());
  TRY(ret, FunctionC());
  return 0;
}

注意:在决定使用宏时应该非常小心,但在这种情况下,我认为可以是解决问题的一种干净方法。但是,必须指出的是,这些语句掩盖了这样一个事实,即函数可以在每一个语句中提前返回。如果您有打开的资源句柄(文件描述符、指向malloc-ed数据的指针等),它们就会泄漏。您和所有使用代码的人都应该意识到这一点,并对比这更复杂的情况使用适当的错误处理和清理例程。

short Function()
{
   short ret = 0;
   if(
       (ret = FunctionA()) != 0 ||
       (ret = FunctionB()) != 0 ||
       (ret = FunctionC()) != 0
     )
   {
      return ret;
   }
   return 0;
}

我将走另一条路,并向您展示我如何在我编写的程序中做到这一点:

short Function() {
    short ret = 0;
    ret = FunctionA();
    if(ret != 0) {
        SomeUsefulMessageOrAssertionHere();
        return ret;
    }
    ...

实际上,减少了上游错误处理代码,因为编写良好的诊断最好在调用站点处理。当然,它不会改变在发生错误时必须采取的行动。

有很多方法可以重写它,但我想不出比你的方法更简单、更直观的了
这里有另一个变体,特别是为了尽量减少if ... return语句的数量而设计的。

int i;
for (i = 0; i<3; +i) {
   switch (i) {
      case 0: ret = FunctionA(); break;
      case 1: ret = FunctionB(); break;
      case 2: ret = FunctionC(); break;
   }
   if (ret != 0) return ret;
}
return 0;

如果我没有犯错误,这应该是等效的

short Function()
{
   short ret = FunctionA();   
   if(ret == 0)
   {
        ret = FunctionB();
        if(ret == 0)
        {
            ret = FunctionC();
        }
    }
   return ret;
}
short Function() {
    short temp;
    return (temp = FunctionA()) ? temp : (temp = FunctionB()) ? temp : FunctionC();
}

您可以编写:

short ret;
if (ret = FunctionA()) return ret;
if (ret = FunctionB()) return ret;
if (ret = FunctionC()) return ret;

不过,你可能会让你的一些同事大吃一惊!

另一种选择,使用短路,灵感来自@Tim的帖子:

short ret;
return (ret = FunctionA()) || (ret = FunctionB()) || (ret = FunctionC()) ? ret : 0;

在C++中,你可以说:

if (short ret = FunctionA()) return ret;

我自己一直喜欢函数指针。

int main()
{
    typedef ret-type (*Fptr)( ... args-types ... );
    const int N_FUNC = 3;
    Fptr functions[] = { FunctionA, FunctionB, FunctionC };
    short ret = 0;
    for( int i=0; ! ret && i < N_FUNCS; i++ )
        ret = functions[i];
    return ret;
}

相关内容

  • 没有找到相关文章

最新更新