繁体   English   中英

如果 != 0 则返回函数结果的 C 宏

[英]C macros to return function result if != 0

我有一个调用其他函数的 C 函数,每个函数都返回int ,如果 != 0,则为0或错误代码。该函数如下所示:

int myfunc()
{
  int err;
  err = func1(arg1);
  if (err != 0) {
    return err;
  }
  err = func2(arg2, arg3);
  if (err != 0) {
    return err;
  }
  err = func3(arg4, arg5);
  if (err != 0) {
    return err;
  }
  err = func4();
  if (err != 0) {
    return err;
  }
  return 0;
}

如您所见,我有很多样板代码:

err = some_func();
if (err != 0) {
  return err;
}

是否可以编写一些宏来简化它? 就像是:

#define TRY() ???

int myfunc()
{
  TRY(func1(arg1));
  TRY(func2(arg2, arg3));
  TRY(func3(arg4, arg5));
  TRY(func4());
}
#define TRY(expression)     \
  do {                      \
    int err = (expression); \
    if (err != 0) {         \
      return err;           \
    }                       \
  } while (0)

这将err范围限制为宏。 如果它在单独的花括号块中,则每次使用相同的变量名称是合法的。

您仍然需要在底部return 0

int myfunc()
{
  TRY(func1(arg1));
  TRY(func2(arg2, arg3));
  TRY(func3(arg4, arg5));
  TRY(func4());
  return 0;
}

也可以看看:

我会说你已经拥有的很好。 是的,它是重复的,但它仍然很容易阅读。 将跳转语句(如return )隐藏在宏后面几乎从来都不是一个好主意。

如果您坚持缩短它,您可以使用逻辑 AND 或 OR 运算符链接函数调用:

if((err = func1(arg1))       != 0 ||
   (err = func2(arg2, arg3)) != 0 ||
   (err = func3(arg4, arg5)) != 0 ||
   (err = func4())           != 0)
{
    return err;
}

这是有效的,因为逻辑运算符具有短路行为。 当第一个 OR 条件为真时,不会评估或执行其余条件。

如果出于某种原因,如代码指南,您不能在if语句条件中进行赋值, if可以将代码链移至其上方:

(err = func1(arg1))       != 0 ||
(err = func2(arg2, arg3)) != 0 ||
(err = func3(arg4, arg5)) != 0 ||
(err = func4())           != 0;

if(err != 0) {
    return err;
}

由于 if 语句的唯一操作是返回错误代码,因此可以通过删除所有 if 语句并在函数末尾只有一个 return 语句来进一步简化。 (感谢乔纳森·莱弗)

(err = func1(arg1))       != 0 ||
(err = func2(arg2, arg3)) != 0 ||
(err = func3(arg4, arg5)) != 0 ||
(err = func4())           != 0;
return err; /* Returns error code or 0. */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM