概述
-
-
- 1. Clang Tools 组织
- 2. 核心 Clang Tools
-
-
- 2.1 clang-check
- 2.2 clang-format
-
- 3. 扩展 Clang Tool
-
-
- 3.1 clang-tidy
-
- 4. 新工具的想法
-
本文为译文,点击 此处查看原文。
Clang Tools
是为 C++ 开发人员设计的独立命令行(可能还有GUI)工具,这些开发人员已经在使用 Clang 作为他们的编译器,并且很喜欢 Clang。这些工具提供面向开发人员的功能,如
快速语法检查(fast syntax checking)
、
自动格式化(automatic formatting)
、
重构(refactoring)
等。
只有几个最基础和最根本的的工具保存在主 Clang 树中。其余的工具保存在一个单独的目录树中,称为 clang-tools-extra。
本文档描述了项目中
Clang Tools
组织的高级概述,并介绍了一些更重要的工具。但是,应该注意的是,本文目前关注的是
Clang
和
Clang Tool
开发人员,而不是这些工具的最终用户。
1. Clang Tools 组织
Clang Tools
是 CLI 或 GUI 程序,它们计划被 C++ 开发人员直接使用。也就是说,它们主要不是为 Clang 开发人员所使用的,尽管它们对碰巧在 Clang 上工作的 C++ 开发人员很有用,而且我们试图积极地利用它们的功能。它们由三个组件开发:用于构建基于 Clang 的独立工具的底层基础设施、许多不同工具以重构和重写库的形式使用的核心共享逻辑,以及工具本身。
Clang Tools
的底层基础设施是 LibTooling 平台。有关此基础设施如何工作的更详细信息,请参阅其文档。公共重构和重写 toolkit-style 库也是 LibTooling 组织的一部分。
一些
Clang Tools
是沿着核心 Clang 库开发的,作为基本功能的示例和测试用例。但是,大多数工具都是在一个分支存储库(side repository)中开发的,以便与核心库轻松分离。我们故意不支持分支存储库中的公共库,因为我们希望在库从一些工具中提取并进入核心 Clang 库集中时,仔细检查并为库找到好的 APIs。
不管
Clang Tools
的代码位于哪个存储库中,所有
Clang Tools
的开发过程和实践都完全是 Clang 本身的开发过程和实践。它们完全在 Clang 项目中,不管版本控制方案如何。
2. 核心 Clang Tools
主存储库中的
Clang Tools
的核心集是非常具体的补充工具,并允许使用和测试 Clang 特定功能。
2.1 clang-check
ClangCheck 将运行一个 Clang tool 的
LibTooling
框架与基本 Clang 诊断相结合,通过在一个快速的命令行界面中语法检查特定的文件。它还可以接受 flags,以便用不同的 flags 以不同的格式重新显示诊断信息,适用于驱动一个 IDE 或编辑器。此外,它还可以在修复模式(fixit-mode)下被使用,以直接应用 clang 提供的修复提示(fixit-hints)。有关如何设置和使用
clang-check
的说明,请参见如何为 LLVM 设置 Clang Tooling。
2.2 clang-format
Clang-format
既是一个库,也是一个独立的工具,其目标是根据可配置的样式指南自动重新格式化 C++ 源文件。为此,
clang-format
使用 Clang 的
Lexer
将一个输入文件转换为一个 token 流,然后更改这些 tokens 周围的所有 white space。目标是
clang-format
既作为一个用户工具(理想情况下是使用功能强大的 IDE 集成),也可以作为其他重构工具的一部分,例如在一个重命名期间更改的所有行进行重新格式化。
3. 扩展 Clang Tool
随着各种
Clang Tools
类别被添加到扩展的存储库(extra repository)中,将在这里跟踪它们。本文档的重点是用于其他工具开发人员的 tools 的范围和特性;每个工具都应该提供自己的以用户为中心的文档。
3.1 clang-tidy
clang-tidy
是一个基于 clang 的 C++ linter 工具。它提供了一个可扩展的框架,用于构建基于编译器的静态分析,检测和修复容易出现bug的模式、性能、可移植性和可维护性问题。
4. 新工具的想法
- C++ 转换工具。将 C-style 的强制转换(
)转换为适当的 C++ 强制转换((type) value
、static_cast
或const_cast
)。reexplt_cast
- 非成员
和begin()
转换工具。将end()
转换为foo.begin()
,类似地用于begin(foo)
,其中end()
是一个标准容器。我们还可以为数组检测类似的模式。foo
-
删除工具。将源代码从使用tr1
库特性迁移到TR1
库。例如:C++11
应改写为:#include <tr1/unordered_map> int main() { std::tr1::unordered_map <int, int> ma; std::cout << ma.size () << std::endl; return 0; }
#include <unordered_map> int main() { std::unordered_map <int, int> ma; std::cout << ma.size () << std::endl; return 0; }
- 移除
的一个工具。将转换auto
为一个显式类型或添加带有推导类型的注释。这样做的动机是,有些开发人员不想使用auto
,因为他们担心对代码失去控制。auto
-
C++ 14:更简洁的操作符函数对象(N3421)。例如:
应改写为: