fmt 库用于 C++ 简介
\n\nfmt 库(或称 fmtlib)是一个用于 C++ 的现代、快速且安全的字符串格式化库。它提供了对 printf 和 sprintf 等过时函数以及繁琐的 std::stringstream 流的替代方案。fmt 的主要目标是让字符串格式化变得简单、类型安全、可扩展且高效。
为什么需要 fmt?首先,它解决了类型安全问题。printf 不检查参数类型,这会导致未定义行为和难以发现的错误。而 fmt 使用 C++ 模板并在编译时检查类型。其次,fmt 比 std::stringstream 快得多,并且通常比 printf 更快。第三,它的语法直观易懂,类似于 Python 的格式化,从而简化了语言间的切换。以至于 fmt 成为了 std::format 的基础,后者已被纳入 C++20 标准。
在这个 pythonlib.ru 网站上,我们经常讨论 Python,但 fmt 是一个很好的例子,展示了 Python 的优秀理念如何迁移到 C++ 世界并成为事实上的标准。如果您用 C++ 编程并希望以现代方式编写代码,fmt 是您工具包中必不可少的库。
\n\n安装 fmt 库
\n\n通过包管理器安装(Conan, vcpkg)
\n\n在现代 C++ 项目中安装 fmt 的最简单方法是使用包管理器。
\n\nConan:
\nconan install fmt/10.1.1@\n# 或者在您的 conanfile.txt 中:\n# [requires]\n# fmt/10.1.1\n\nvcpkg:
\nvcpkg install fmt\n# 然后在 CMakeLists.txt 中:\n# find_package(fmt CONFIG REQUIRED)\n# target_link_libraries(your_project PRIVATE fmt::fmt)\n\n手动安装(从源码编译)
\n\n您可以从 GitHub 下载源代码并使用 CMake 编译:
\ngit clone https://github.com/fmtlib/fmt.git\ncd fmt\nmkdir build && cd build\ncmake ..\nmake -j4\nsudo make install\n\n通过 pip 安装(用于 Python 扩展)
\n\n尽管 fmt 是一个 C++ 库,但如果您使用 pybind11 或 cppyy 编写 C++ 扩展,也可以将其作为 Python 包安装:
\npip install fmt\n然而,在纯 C++ 的上下文中,这没有意义。通常您只需包含头文件即可。
\n\n集成到项目中(仅头文件模式)
\n\nfmt 可以以仅头文件模式使用,只需将 include/fmt 文件夹复制到您的项目中并添加:
#define FMT_HEADER_ONLY\n#include "fmt/core.h"\n#include "fmt/format.h"\n\n快速入门及代码示例
\n\n让我们从一个最简单的示例开始,演示基本的格式化:
\n\n#include <fmt/core.h>\n#include <fmt/format.h>\n#include <iostream>\n\nint main() {\n // 最简单的格式化\n std::string message = fmt::format("你好,{}!你{}岁了。", "世界", 42);\n std::cout << message << std::endl;\n\n // 输出到 stdout\n fmt::print("圆周率大约为 {:.2f}\\n", 3.14159);\n\n // 使用命名参数的格式化(C++20 风格)\n fmt::print("用户:{name},年龄:{age}\\n",\n fmt::arg("name", "爱丽丝"),\n fmt::arg("age", 30));\n\n return 0;\n}\n\n这段代码将输出:
\n你好,世界!你42岁了。\n圆周率大约为 3.14\n用户:爱丽丝,年龄:30\n\n如您所见,{} 语法与 Python 非常相似。一切直观且可读。
fmt 库的主要方法和函数
\n\n以下是 fmt 关键函数的详细解析。我们将介绍它们的签名、参数和示例