R
rth_out
C & C++
源码 ↗
RTH_OUT · C & C++ 双语言输出层

从裸金属到现代 C++
同一套输出哲学

rth_out.c 是一个无 include、无 typedef、无 libc 的 C 语言输出原语层, 覆盖 Windows、Linux、macOS、FreeBSD 等平台,直接通过系统调用或 Win32 API 完成写入。
rth_out_pro.cpp 在其之上构建现代 C++ 输出抽象, 将运行时流式、编译期常量与高速缓冲三种能力解耦为独立模块。

0 依赖 · 无 libc 8+ 平台架构 6 大输出通道 C99 / C++11+
RTH_OUT_C · BARE METAL LAYER

无 include 的 裸金属输出

rth_out.c 不包含任何标准库头文件,不定义 typedef,不依赖 libc。 所有写入都通过内联汇编的系统调用或 Win32 API 完成,可以直接编译进 freestanding 环境。

Windows
MSVC / MinGW / Cygwin / MSYS2
→ Win32 API (dllimport)
Linux x86_64
syscall 1 = write
→ 内联汇编 syscall
Linux i386
int 0x80 · syscall 4
→ 内联汇编中断
Linux aarch64
svc #0 · syscall 64
→ 内联汇编 svc
Linux armv7
svc #0 · syscall 4
→ EABI 寄存器约定
Linux riscv64
ecall · syscall 64
→ 内联汇编 ecall
macOS x64 / arm64
0x2000000 前缀 · svc #0x80
→ 独立 syscall 约定
FreeBSD x86_64
syscall 4 = write
→ 与 Linux 不同的系统调用号
⊘

零依赖原语

无 #include、无 typedef、无 libc。所有类型使用内置关键字表达,可直接编译进 freestanding 或嵌入式环境,链接后体积几乎为零。

⇄

六大输出通道

通过 roc_stdout、roc_stderror、roc_fileout、roc_logout、roc_netout 等开关按需启用,覆盖终端、文件、日志与 TCP 网络输出。

◈

通道级日志

内置 DEBUG / INFO / WARN / ERROR / FATAL 五级日志,支持外部注入时间函数或使用内部时钟,日志行格式为 [时间] [级别] 消息。

LAYERED ARCHITECTURE

分层关系:C 原语支撑 C++ 抽象

rth_out.c 提供平台无关的 roc_raw_write() 原语,rth_out_pro.cpp 通过 rth_io 继承这套原语, 在此之上构建类型萃取、格式化与三种输出模式。

L3
rth_out_pro.cpp C++11+
三模式输出抽象:runtime_normal_out(流式)、constant_out(编译期)、runtime_fast_out(缓冲)。 类型萃取、浮点健壮格式化、模板化 operator<< 链。
↑
L2
rth_io / rth_io_pro.cpp C++98+
提供 writer() 原语的多编译器分发:GCC / Clang / MSVC / Intel / ARMClang 等 40 种编译器, 根据平台与架构选择对应的汇编或 API 调用。
↑
L1
rth_out.c C99
最底层原语:roc_raw_write()、roc_file()、roc_file_append()、roc_log_write()、roc_net_send()。 无 include,直接调用系统调用或 Win32 API。
↑
L0
操作系统 / 硬件
Linux syscall · Windows WriteFile · macOS svc · FreeBSD syscall · 裸机设备。
THREE OUTPUT MODES

C++ 层的 三种模式

rth_out_pro.cpp 将输出能力解耦为三个可独立启用的模块,通过顶层宏精确控制编译裁剪。

runtime_normal_out

流式输出

最接近 std::cout 的使用体验,但性能高出数倍。每次 operator<< 直接触发 writer() 系统调用。

  • 手写 lltoa / ulltoa,比 sprintf 快 3-5 倍
  • 浮点 6 位小数四舍五入 + 尾零消除
  • 完整处理 INF / NaN / 负零
适用:调试日志 · 交互式 CLI · 嵌入式终端
constant_out

编译期常量拼接

允许在 constexpr 上下文中完成字符串格式化,零运行时开销。

  • constantout_t<N> 模板追踪容量
  • constexpr 版本 lltoa / ulltoa,无 UB
  • 支持 + / * / << 三种组合操作符
适用:编译期日志 · 静态资源表 · 模板元编程
runtime_fast_out

缓冲式高速输出

编译期已知容量的固定缓冲区 + 运行时流式追加,最后一次性刷出。

  • fastout_t<N> 栈缓冲区,零堆分配
  • << out 触发单次 writer() 调用
  • 每线程独立缓冲,无锁竞争
适用:高频交易日志 · 游戏引擎 · 服务端访问日志
CODE SAMPLES

C 层与 C++ 层的 典型用法

// rth_out.c — 直接调用原语

main.c C99
/* 定义 _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

// rth_out_pro.cpp — 三种模式

main.cpp C++11+
#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;
}
roc_raw_write_x64.s C 层核心原语
/* 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;
}
COMPARISON

rth_out.c 与 rth_out_pro.cpp 的 定位对比

维度 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++ 工程 / 服务端 / 日志系统
QUICK START

快速上手

C 层可独立使用,C++ 层通过宏开关按需裁剪三种模式。

// 编译 rth_out.c

terminal
# 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

// 编译 rth_out_pro.cpp

terminal
# 启用全部三模式(默认)
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
C 层所有写入都绕过 printf / iostream 的缓冲层,直接发起系统调用。 C++ 层在此基础上叠加类型萃取与格式化,不引入任何堆分配。

从裸机到 C++,一套输出哲学

rth_out.c 把「写入」这件事还原到系统调用原语,不引入任何运行时依赖; rth_out_pro.cpp 在此基础上构建现代 C++ 的类型安全与编译期能力。 两者共享同一套平台检测与系统调用分发逻辑,从裸机固件到高吞吐服务端, 都能找到合适的输出抽象层。

C99 零依赖原语 C++11+ 三模式抽象 8+ 平台架构 0 堆分配 · 0 libc