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

标签 c macros c-preprocessor

我有一个调用其他函数的 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 的范围限于宏。如果变量名位于单独的花括号 block 中,则每次都使用相同的变量名是合法的。

您仍然需要在底部使用 return 0

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

另见:

关于如果 != 0,则返回函数结果的 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59048714/

相关文章:

ios - 我什么时候应该使用#ifdef 而不是if()?

c - 这个 Valgrind 警告是什么意思? - 警告设置地址范围权限

c - 如何在结构中正确使用 fgets?

填充数组的代码突然改变变量(C)

c - 如何将 C 宏 (#define) 分离到 .h 和 .c 文件中

c++ - 一个宏可以在不同的地方捕获一组异常吗?

C 预处理器摆脱 __align__ 和 __attribute__

c - 为什么 main 没有声明为 extern

c - C 中的宏问题

c++ - const * const 的预处理器简写