← 所有精選

★ GitHub Trending 精選

每日一個爆紅開源專案

日榜 #12026-09-03

fmtlib/fmt

A modern formatting library

★ 24.2k stars · ▲ +14 今日 · 🔶 C++ · 📜 MIT · 官網在 GitHub 開啟 ↗
c-plus-pluschronocppcross-platformfloating-pointformattingmultiplatformoutputperformanceprintfrangesunicode

這是什麼

{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 重點摘要