什么是 em)io?
简单来说,emio是一个“安全又快速”的高低层字符输入/输出库,专为裸机(bare-metal)和 RTOS 嵌入式系统设计。它最大的亮点:二进制体积超小(比流行的 fmtlib 小了约 38 倍),无需堆,C++20 支持,既能高层次格式化,也能低层次逐字符操作。
它能帮你做什么?
-
• 格式化输出:和
fmt::format类似,用emio::format("Hello, {}!", name)拼字符串; -
• 安全扫描:用
emio::scan把字符串中的数字或文本读出来,不抛异常,返回result对象; -
• 无堆栈静态缓冲:
emio::static_buffer<128>,全程无 new/delete; -
• 底层读写:
writer.write_int(42)、reader.parse_int<uint32_t>(),直接面向字节和字符。 -
解决了哪些痛点?
嵌入式开发常见的 I/O 库,不是体积太大,就是不安全(抛异常、需要堆),或者性能不够。emio 主要解决了:
-
• 体积焦虑:固件空间宝贵,用 fmtlib 那堆模板和异常,会把镜像撑大;
-
• 实时性需求:裸机/RTOS 环境里,不允许在中断里抛异常;
-
• 零依赖:不依赖标准库的堆、锁等,适合各种微控制器;
-
• 一套搞定:既要高阶格式化,也要分字节读写,一次性满足。
快速对比:emio vs fmtlib
|
特性 |
emio |
fmtlib |
|
二进制体积 |
≈38 倍更小 |
较大 |
|
异常机制 |
返回 |
默认抛异常 |
|
堆依赖 |
无 |
根据编译选项有或无 |
|
高/低层 API |
高层 |
主要高层 |
|
编译期支持 |
constexpr
友好 |
较友好 |
使用场景展示
// 高层:格式化 & 扫描
std::string s = emio::format("温度:{}℃",25);
int temp{};
if(emio::scan(s,"温度:{}℃", temp)){
emio::print("当前温度:{}℃\n", temp);
}
// 无堆栈静态缓冲
emio::static_buffer<64> buf;
emio::format_to(buf,"电压:{:.2f}V",3.3).value();
buf.view();// -> 电压:3.30V
// 低层:逐字符写入
emio::writer wrt{buf};
wrt.write_str(" 状态:").value();
wrt.write_int(1).value();// 1 表示正常
wrt.write_char('\n').value();
buf.view();
优缺点一览
|
优点 |
缺点 |
|
极小的二进制体积 |
功能聚焦,缺少高级格式功能(如自定义格式化) |
|
无堆依赖、无异常抛出 |
社区生态和教程相比 fmtlib 还在成长 |
|
同时支持高层和底层 API |
文档尚在完善中,设计文档需深入研究 |
|
C++20 编译期友好 |
目前处于 beta 状态 |
总结
总之,如果你正在做 裸机/RTOS 嵌入式开发,特别是对固件体积敏感、不能用异常、又想要现代 C++ 格式化和扫描能力,emio 真的是一个轻量级且“贴地气”的好选择。它帮你把常见的字符 I/O 问题都包起来,既能高层简单用,关键时候也能下到字节级操作。虽然还在 beta,生态和文档都需要大家一起“添砖加瓦”,但它的方向和目标都很明确:小、快、安全、零依赖。
项目地址:https://github.com/Viatorus/emio