fmtlib/fmt
A modern formatting library
這是什麼
{fmt} 是一個面向 C++ 的開源格式化函式庫,定位很明確:用更快、更安全、語法更現代的方式,取代傳統 C stdio 與 C++ iostreams 的文字輸出與字串格式化。它提供簡潔的 fmt::format、fmt::print API,格式字串語法接近 Python 的 format,同時實作 C++20 std::format 與 C++23 std::print 相關能力。README 強調的核心價值不只是「好寫」,還包括型別安全、可在 C++20 回報格式字串錯誤、預設不依賴 locale、支援 Unicode、chrono、ranges、顏色樣式與使用者自訂型別。換句話說,它把 C++ 裡常見但容易寫得笨重的輸出、記錄、檔案寫入與數值格式化,整理成一套小而完整的基礎工具。
為什麼上榜
這次日榜選中的是 fmtlib/fmt,總星數約 24,226,今日新增 14 顆星。它不是那種靠一個新 demo 爆紅的專案,而是 C++ 生態裡長期被廣泛採用的基礎建設:README 列出 FoundationDB、ClickHouse、Envoy、MariaDB、PyTorch、Windows Terminal、spdlog 等知名專案都在使用。它上榜的亮點,在於「格式化」這件事雖然看似底層,卻牽涉效能、二進位大小、可攜性、型別安全與開發體驗。README 的 benchmark 顯示 {fmt} 12.1 在特定 speed test 中比 printf 更快,且在編譯時間與程式碼膨脹測試裡,比 iostreams、Boost Format 等方案輕量許多;這讓它在高效能 C++ 專案中有很清楚的存在理由。
適合誰,可以拿來做什麼
C++ 開發者 是最直接的目標使用者,特別是正在維護大型 codebase、需要替換 printf/iostreams、或希望導入更安全輸出方式的團隊。README 也點出 clang-tidy v18 的 modernize-use-std-print 檢查可協助把 printf、fprintf 轉成 fmt::print(預設是轉成 std::print,但可設定)。實務上,它適合用在 CLI 工具、伺服器日誌、資料庫、遊戲、終端機、科學運算與任何重視輸出效能的 C++ 專案。上手門檻不高:README 範例從 fmt::print("Hello, world!\n") 到格式化字串、日期時間、容器輸出、彩色終端文字都有。但若團隊已鎖定標準函式庫的 std::format/std::print,就需要評估是否仍要引入外部相依;{fmt} 的優勢在於成熟度、跨平台一致性、較舊編譯器支援與豐富擴充。
上手
README 主要以範例展示使用方式,完整建置與測試指向官方文件的 Building the library。最小的 stdout 範例如下:
#include <fmt/base.h>
int main() {
fmt::print("Hello, world!\n");
}
格式化字串則可直接使用 fmt::format:
std::string s = fmt::format("The answer is {}.", 42);
// s == "The answer is 42."
若想格式化時間或容器,README 顯示可分別引入 fmt/chrono.h 與 fmt/ranges.h。專案也支援 header-only 模式,可透過 FMT_HEADER_ONLY 巨集啟用;若要從原始碼建置與跑測試,README 要求參考官方文件。效能 benchmark 另放在 fmtlib/format-benchmark,需 git clone --recursive 後以 CMake 產生 Makefile,再執行 make speed-test 或 make bloat-test。
README 重點摘要
- 安全性:README 強調完全型別安全,格式字串錯誤可在 C++20 編譯期被回報,自動記憶體管理也避免 buffer overflow 類問題。
- 效能:內文 benchmark 顯示
{fmt} 12.1在指定測試中跑出 0.44 秒,快於printf的 0.66 秒;浮點格式化也採用 Dragonbox,追求正確 rounding、短表示與 round-trip 保證。 - 可攜與易用:支援 Linux、macOS、Windows CI,預設 locale independent,沒有外部相依,授權為 MIT,也可用 header-only 設定。
- 功能面廣:除了基本字串格式化,README 範例涵蓋 positional arguments、chrono、ranges、檔案輸出、彩色與樣式化終端文字,以及自訂型別格式化。
- 成熟度:專案有大量測試、持續 fuzzing、OpenSSF/Security Scorecards 標章,並被多個知名 C++ 專案採用,屬於偏底層但影響範圍很大的基礎函式庫。