流式输出
最接近 std::cout 的使用体验,但性能高出数倍。每次 operator<< 直接触发 writer() 系统调用。
- 手写 lltoa / ulltoa,比 sprintf 快 3-5 倍
- 浮点 6 位小数四舍五入 + 尾零消除
- 完整处理 INF / NaN / 负零
rth_out.c 是一个无 include、无 typedef、无 libc 的 C 语言输出原语层,
覆盖 Windows、Linux、macOS、FreeBSD 等平台,直接通过系统调用或 Win32 API 完成写入。
rth_out_pro.cpp 在其之上构建现代 C++ 输出抽象,
将运行时流式、编译期常量与高速缓冲三种能力解耦为独立模块。
rth_out.c 不包含任何标准库头文件,不定义 typedef,不依赖 libc。 所有写入都通过内联汇编的系统调用或 Win32 API 完成,可以直接编译进 freestanding 环境。
无 #include、无 typedef、无 libc。所有类型使用内置关键字表达,可直接编译进 freestanding 或嵌入式环境,链接后体积几乎为零。
通过 roc_stdout、roc_stderror、roc_fileout、roc_logout、roc_netout 等开关按需启用,覆盖终端、文件、日志与 TCP 网络输出。
内置 DEBUG / INFO / WARN / ERROR / FATAL 五级日志,支持外部注入时间函数或使用内部时钟,日志行格式为 [时间] [级别] 消息。
rth_out.c 提供平台无关的 roc_raw_write() 原语,rth_out_pro.cpp 通过 rth_io 继承这套原语, 在此之上构建类型萃取、格式化与三种输出模式。
rth_out_pro.cpp 将输出能力解耦为三个可独立启用的模块,通过顶层宏精确控制编译裁剪。
最接近 std::cout 的使用体验,但性能高出数倍。每次 operator<< 直接触发 writer() 系统调用。
允许在 constexpr 上下文中完成字符串格式化,零运行时开销。
编译期已知容量的固定缓冲区 + 运行时流式追加,最后一次性刷出。
/* 定义 _start_rt / _end_rt 后可省略 main 声明 */ _start_rt /* 标准输出 */ roc_stdout_write("Hello\n", 6); /* 文件追加 */ roc_file_append("app.log", "boot\n", 5); /* 分级日志:自动加时间戳与级别 */ roc_log_info("app.log", "started", 7); _end_rt
#include <rth_out_pro> int main() { // 模式一:流式输出 rttype::out << "PID=" << 1234 << rttype::endl; // 模式二:编译期常量 constexpr auto banner = rttype::constantout<64>{} << "v2.0"; // 模式三:高速缓冲 rttype::fastrt::fastout_t<256> buf; buf << "STATUS=" << "OK"; buf << rttype::fastrt::out; return 0; }
/* Linux x86_64:直接发起 write 系统调用,循环处理部分写入 */ static inline long roc_raw_write(long fd, const char* b, unsigned long l) { long total = 0, n; while (l > 0) { __asm__ volatile("syscall" : "=a"(n) : "a"(1L), "D"(fd), "S"((long)b), "d"((long)l) : "rcx", "r11", "memory"); if (n < 0) return total ? total : -1; if (n == 0) break; total += n; b += n; l -= (unsigned long)n; } return total; }
| 维度 | rth_out.c | rth_out_pro.cpp |
|---|---|---|
| 语言标准 | C99 | C++11 起(推荐 C++17) |
| 依赖 | 无 include · 无 libc · 无 typedef CORE | 依赖 rth_io / rth_io_pro 的 writer() 原语 |
| 核心原语 | roc_raw_write / roc_file / roc_log_write / roc_net_send | rttype::out_t + operator<< 链 |
| 输出通道 | stdout / stderr / file / log / net(宏开关) | 流式 / 编译期 / 缓冲(三模式) |
| 格式化能力 | 无,只做原始字节写入 | 整数 / 浮点 / 指针 / 字符串 自动格式化 FMT |
| 编译期能力 | 不支持 | constantout_t 编译期字符串拼接 NEW |
| 平台覆盖 | Windows / Linux / macOS / FreeBSD,多架构汇编 | 继承 C 层平台,另加 40 种编译器分发 |
| 适用场景 | 裸机 / 嵌入式 / 无 libc 环境 | 现代 C++ 工程 / 服务端 / 日志系统 |
C 层可独立使用,C++ 层通过宏开关按需裁剪三种模式。
# Linux x86_64:无需任何 -l 链接 gcc -std=c99 -O2 -nostdlib main.c -o app # Windows MSVC cl /O2 /D roc_fileout main.c # 关闭某个通道(例如不需要网络) gcc -std=c99 -O2 -U roc_netout main.c
# 启用全部三模式(默认) g++ -std=c++17 -O2 main.cpp # 仅启用快速输出(嵌入式裁剪) g++ -std=c++17 -O2 \ -D rth_out_pro_constant_out \ -D rth_out_pro_runtime_normal_out \ main.cpp
rth_out.c 把「写入」这件事还原到系统调用原语,不引入任何运行时依赖; rth_out_pro.cpp 在此基础上构建现代 C++ 的类型安全与编译期能力。 两者共享同一套平台检测与系统调用分发逻辑,从裸机固件到高吞吐服务端, 都能找到合适的输出抽象层。