嵌入式开发:如何实现类似布尔返回值的简洁错误码传递写法?
枚举错误码的简洁错误传递写法
针对嵌入式场景无法使用异常、需要传递枚举类型错误码的需求,以下几种写法可实现类似布尔返回值的简洁性,同时保留错误码传递能力:
方法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
相关产品推荐
相关产品推荐

