fmt 用于 C++:完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

fmt 库用于 C++ 简介

\n\n

fmt 库(或称 fmtlib)是一个用于 C++ 的现代、快速且安全的字符串格式化库。它提供了对 printf 和 sprintf 等过时函数以及繁琐的 std::stringstream 流的替代方案。fmt 的主要目标是让字符串格式化变得简单、类型安全、可扩展且高效。

\n\n

为什么需要 fmt?首先,它解决了类型安全问题。printf 不检查参数类型,这会导致未定义行为和难以发现的错误。而 fmt 使用 C++ 模板并在编译时检查类型。其次,fmt 比 std::stringstream 快得多,并且通常比 printf 更快。第三,它的语法直观易懂,类似于 Python 的格式化,从而简化了语言间的切换。以至于 fmt 成为了 std::format 的基础,后者已被纳入 C++20 标准。

\n\n

在这个 pythonlib.ru 网站上,我们经常讨论 Python,但 fmt 是一个很好的例子,展示了 Python 的优秀理念如何迁移到 C++ 世界并成为事实上的标准。如果您用 C++ 编程并希望以现代方式编写代码,fmt 是您工具包中必不可少的库。

\n\n

安装 fmt 库

\n\n

通过包管理器安装(Conan, vcpkg)

\n\n

在现代 C++ 项目中安装 fmt 的最简单方法是使用包管理器。

\n\n

Conan:

\n
conan install fmt/10.1.1@\n# 或者在您的 conanfile.txt 中:\n# [requires]\n# fmt/10.1.1
\n\n

vcpkg:

\n
vcpkg 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 编译:

\n
git 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 包安装:

\n
pip install fmt
\n

然而,在纯 C++ 的上下文中,这没有意义。通常您只需包含头文件即可。

\n\n

集成到项目中(仅头文件模式)

\n\n

fmt 可以以仅头文件模式使用,只需将 include/fmt 文件夹复制到您的项目中并添加:

\n
#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 非常相似。一切直观且可读。

\n\n

fmt 库的主要方法和函数

\n\n

以下是 fmt 关键函数的详细解析。我们将介绍它们的签名、参数和示例

推荐