测试返回值并返回

问题描述 投票:0回答:1

这可能是一个愚蠢的问题,但我正在研究是否有一种简洁的方法来测试函数的返回结果,并且如果它不满足条件,则返回该值(即传递它)。

现在要解决一个可能的问题,是的,我正在寻找的内容与例外提供的内容类似。然而,作为一名嵌入式开发人员,与异常相关的开销(不幸的是)代价太高了。

例如,

enum class Status
{
    OKAY,
    ERROR1,
    ERROR2,
    ERROR3
};

Status foo1();
Status foo2();
Status foo3();

Status bar()
{
    Status result;

    result = foo1();
    if (result != Status::OKAY) return result;
   
    result = foo2();
    if (result != Status::OKAY) return result;

    result = foo3();
    if (result != Status::OKAY) return result;

    return Status::OKAY;
}

如果我只是使用 bool 作为返回值,则简写如下:

bool bar()
{
    if (!foo1()) return false;
    if (!foo2()) return false;
    if (!foo3()) return false;

    return true;
}

像这样的副作用 if 子句被认为是一种代码味道,但这对我来说似乎比局部变量赋值和测试更具可读性和简洁性。

是否有一种简写方法可以实现与第二个示例相同的可读性,但具有与第一个示例相同的效果?

c++ return c++17
1个回答
2
投票

一种方法是使用宏:

enum class Status
{
    OKAY,
    ERROR1,
    ERROR2,
    ERROR3
};

#define CHECK_STATUS(call_site)\
    do {\
      Status result = call_site;\
      if (result != Status::OKAY) return result;\
    } while(0)

Status foo1();
Status foo2();
Status foo3();

Status bar()
{
    CHECK_STATUS(foo1());
   
    CHECK_STATUS(foo2());
    
    CHECK_STATUS(foo3());

    return Status::OKAY;
}

如果您对

do ... while(0)
感到困惑,请检查以下内容: do { ... } while (0) — 它有什么用?

© www.soinside.com 2019 - 2024. All rights reserved.