← 返回信息流
GitHub 热榜GitHub Trending · 日·1 小时前

yaml-cpp:一个C++的YAML解析与生成库

原标题:jbeder/yaml-cpp
C++6,048 stars+65 今日

速览

提供完整的YAML 1.2解析和发射器API,支持节点访问、迭代和序列化/反序列化,适用于C++项目的配置文件处理或数据交换场景。

AI 深度解读

这是什么

yaml-cpp 是一个用现代 C++ 编写的 YAML 解析与生成库,遵循 YAML 1.1 规范。它提供了简洁的 C++ API,允许开发者将 YAML 文档解析为节点树,或从内存中的数据结构序列化为 YAML 格式文本。项目采用 CMake 构建系统,支持 Windows、macOS 和类 Unix 平台,当前在 GitHub 上拥有超过 6000 个 Star,是 C++ 生态中最常用的 YAML 处理库之一。

解决的问题

在 C++ 项目中,YAML 以其可读性和层次结构常被用作配置文件、数据交换格式或测试用例描述。yaml-cpp 解决了 C++ 开发者需要手动解析 YAML 文本的痛点,提供了开箱即用的解析、序列化、节点遍历与修改能力,无需依赖外部 C 库或手动处理字符串解析。它使得 YAML 数据可以像原生 C++ 数据结构一样被访问和操作,简化了配置管理等场景的工程实现。

核心功能

  • YAML 文本解析:将 YAML 字符串或文件加载为 YAML::Node 树,支持标量、映射、序列等所有 YAML 结构。
  • 节点操作:通过 operator[]、迭代器、模板化转换(as<T>())等方式读写节点值;支持添加/删除子节点。
  • 序列化输出:将 YAML::Node 树输出为格式化的 YAML 字符串或写入文件。
  • 类型转换:内置对常见 C++ 类型(intdoublestd::stringstd::vectorstd::map 等)的转换支持;用户可通过特化 YAML::convert 模板为自定义类型添加转换规则。
  • 错误处理:解析失败时抛出异常,异常信息包含位置和错误描述。
  • CMake 集成:通过 FetchContentfind_package 直接引入,无需手动拷贝源码;支持构建为静态库或共享库。

亮点 / 与同类相比

  • API 直观现代:相比底层 C 库 libyaml(需手动管理文档状态),yaml-cpp 的节点树模型与 C++ 容器(如 std::mapstd::vector)对齐,上手成本低。
  • 广泛兼容性:被多个大型项目(如 ROS、OpenCV、LLVM 中的某些工具)采用,文档和社区支持充分,Stack Overflow 上有大量现成问题解答。
  • 轻量无额外依赖:仅依赖 C++11 标准库,不需要 Boost 或其他第三方库;二进制体积小,适合资源受限场景。
  • 灵活构建选项:支持 DYAML_BUILD_SHARED_LIBS 切换动静库;可配合 Google Test 运行单元测试(默认关闭系统 GTEST 以启用 _GLIBCXX_DEBUG 调试模式)。
  • 与新兴的 rapidyaml(侧重极致解析速度)相比,yaml-cpp 在易用性和功能完整性上更胜一筹,提供了更丰富的节点操作和序列化能力。

适合谁用 / 上手

  • 目标用户:C++ 开发者,需要在项目中处理 YAML 配置文件、国际化消息、测试数据或任何层次化文本数据。尤其适合已有 CMake 构建的项目。
  • 快速集成:在 CMakeLists.txt 中添加以下代码即可引入(无需手动下载):
    include(FetchContent)
    FetchContent_Declare(yaml-cpp GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git GIT_TAG yaml-cpp-0.7.0)
    FetchContent_MakeAvailable(yaml-cpp)
    target_link_libraries(your_target PRIVATE yaml-cpp::yaml-cpp)
    
  • 基础用法示例
    #include <yaml-cpp/yaml.h>
    // 解析 YAML 字符串
    YAML::Node config = YAML::Load("{name: Alice, age: 30}");
    std::string name = config["name"].as<std::string>();
    int age = config["age"].as<int>();
    // 修改并输出
    config["age"] = 31;
    std::cout << YAML::Dump(config) << std::endl;
    
  • 构建注意:若使用 GNU 标准库调试模式(_GLIBCXX_DEBUG),需确保 yaml-cpp 和客户端代码都以此模式编译,且 Google Test 也使用相同标志(默认关闭系统 GTEST)。
查看原文 →github.com