这可能是一个愚蠢的问题,但我正在研究是否有一种简洁的方法来测试函数的返回结果,并且如果它不满足条件,则返回该值(即传递它)。
现在要解决一个可能的问题,是的,我正在寻找的内容与例外提供的内容类似。然而,作为一名嵌入式开发人员,与异常相关的开销(不幸的是)代价太高了。
例如,
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 子句被认为是一种代码味道,但这对我来说似乎比局部变量赋值和测试更具可读性和简洁性。
是否有一种简写方法可以实现与第二个示例相同的可读性,但具有与第一个示例相同的效果?
一种方法是使用宏:
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) — 它有什么用?