为您的应用程序选择正确的接口

Clang 提供了用于编写需要程序语法和语义信息的工具的基础设施。本文档将简要介绍编写 clang 工具的不同方法及其优缺点。

LibClang

LibClang 是 clang 的稳定高级 C 接口。如有疑问,LibClang 可能是您想要使用的接口。仅当您有充分的理由不使用 LibClang 时,才考虑其他接口。

何时使用 LibClang 的典型示例

  • Xcode

  • Clang Python 绑定

当您... 时,请使用 LibClang

  • 希望从 C++ 以外的其他语言与 clang 交互

  • 需要一个稳定的接口,以确保向后兼容性

  • 希望使用强大的高级抽象,例如使用游标遍历 AST,并且不想学习 Clang AST 的所有细节。

当您... 时,请勿使用 LibClang

  • 希望完全控制 Clang AST

Clang 插件

Clang 插件 允许您在编译过程中对 AST 运行附加操作。插件是动态库,在运行时由编译器加载,并且易于集成到您的构建环境中。

何时使用 Clang 插件的典型示例

  • 针对您的项目的特殊 lint 风格警告或错误

  • 从单个编译步骤创建额外的构建工件

当您... 时,请使用 Clang 插件

  • 需要您的工具在任何依赖项更改时重新运行

  • 希望您的工具能够构建或破坏构建

  • 需要完全控制 Clang AST

当您... 时,请勿使用 Clang 插件

  • 希望在构建环境之外运行工具

  • 希望完全控制 Clang 的设置方式,包括内存中虚拟文件的映射

  • 需要对项目中的特定文件子集运行,这些文件子集不一定与会触发重建的任何更改相关

LibTooling

LibTooling 是一个 C++ 接口,旨在编写独立工具,以及集成到运行 clang 工具的服务中。何时使用 LibTooling 的典型示例

  • 简单的语法检查器

  • 重构工具

当您... 时,请使用 LibTooling

  • 希望在单个文件或特定文件子集上运行工具,独立于构建系统

  • 希望完全控制 Clang AST

  • 希望与 Clang 插件共享代码

当您... 时,请勿使用 LibTooling

  • 希望作为由依赖项更改触发的构建的一部分运行

  • 希望使用稳定的接口,因此您无需在 AST API 更改时更改代码

  • 希望开箱即用地使用高级抽象,例如游标和代码完成

  • 不想用 C++ 编写工具

Clang 工具 是作为 Clang 项目一部分构建在 LibTooling 基础设施之上的特定开发工具集合。它们的目标是自动化和改进 C/C++ 开发人员的核心开发活动。

作为 Clang 项目的一部分,我们正在构建或计划构建的工具示例

  • 语法检查 (clang-check)

  • 自动修复编译错误 (clang-fixit)

  • 自动代码格式化 (clang-format)

  • 新语言标准中新功能的迁移工具

  • 核心重构工具