为您的应用程序选择正确的接口¶
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)
新语言标准中新功能的迁移工具
核心重构工具