You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌入式开发:如何实现类似布尔返回值的简洁错误码传递写法?

枚举错误码的简洁错误传递写法

针对嵌入式场景无法使用异常、需要传递枚举类型错误码的需求,以下几种写法可实现类似布尔返回值的简洁性,同时保留错误码传递能力:

方法1:C++17初始化if(无额外封装)

利用C++17原生支持的if语句初始化特性,直接在判断逻辑中完成赋值与检查,省去全局临时变量:

Status bar()
{
    if (const auto res = foo1(); res != Status::OKAY) return res;
    if (const auto res = foo2(); res != Status::OKAY) return res;
    if (const auto res = foo3(); res != Status::OKAY) return res;

    return Status::OKAY;
}

这种写法无需额外工具,语法直观,可读性接近布尔场景的简洁写法,同时完整保留错误码传递功能。

方法2:宏封装(兼容旧C++标准)

如果项目使用C++17之前的标准,宏是最直接的封装方式,将重复的赋值、判断、返回逻辑打包:

// 用do-while(0)避免语法歧义,确保宏在任何场景下都能正确展开
#define CHECK_STATUS(expr) do { \
    const Status res = (expr); \
    if (res != Status::OKAY) return res; \
} while(0)

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

    return Status::OKAY;
}

宏的优势是写法极致简洁,和布尔场景的if(!foo()) return false一样直观,且兼容所有C++标准,适配嵌入式环境的兼容性要求。

方法3:辅助函数封装(类型安全)

若不想使用宏,可通过inline辅助函数封装错误判断逻辑,兼顾简洁性与类型安全:

inline bool is_error(Status res) {
    return res != Status::OKAY;
}

Status bar()
{
    auto res = foo1();
    if (is_error(res)) return res;

    res = foo2();
    if (is_error(res)) return res;

    res = foo3();
    if (is_error(res)) return res;

    return Status::OKAY;
}

这种方式通过函数封装判断逻辑,比原生写法更简洁,同时避免宏可能带来的潜在问题,适合对类型安全要求较高的场景。


内容的提问来源于stack exchange,提问作者Patrick Wright

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:43:27